Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails ActiveRecord创建或查找_Ruby On Rails_Ruby_Activerecord_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails Rails ActiveRecord创建或查找

Ruby on rails Rails ActiveRecord创建或查找,ruby-on-rails,ruby,activerecord,ruby-on-rails-4,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 4,我正在开发一个Rails 4应用程序,在我发布的api方法中,我希望根据用户试图创建的内容查找记录,如果记录不存在,则创建它,如果它确实更新了它拥有的参数。我写了一些代码,实际上可以做到这一点,但执行起来需要一些时间。有没有其他方法可以用更少的代码或查询完成同样的事情 @picture = current_picture.posts.where(post_id: params[:id]).first_or_initialize @picture.update_attributes(active:

我正在开发一个Rails 4应用程序,在我发布的api方法中,我希望根据用户试图创建的内容查找记录,如果记录不存在,则创建它,如果它确实更新了它拥有的参数。我写了一些代码,实际上可以做到这一点,但执行起来需要一些时间。有没有其他方法可以用更少的代码或查询完成同样的事情

@picture = current_picture.posts.where(post_id: params[:id]).first_or_initialize
@picture.update_attributes(active: true, badge: parameters[:badge], identifier: parameters[:identifier])
render json: @picture
表示
find\u by
未被弃用:

除按查找外的所有动态方法。。。然后通过…找到你。。。!是 不赞成

此外,根据,仍然可以使用
find\u或\u create\u by
方法,但已重写以符合以下语法:

@picture = current_picture.posts.find_or_create_by(post_id: params[:id])
更新:

根据报告:


因此,在Rails 4中,可以将多个属性作为参数传递给
find\u或

您可以按如下操作:

@picture=当前图片。posts.where(post\u id:params[:id])。查找或创建


这将找到带有params[:id]的帖子,如果找不到该记录,它将在当前图片下创建带有该id的帖子记录。

谢谢,但我认为Rails 4中该方法被贬低了,我想不会。所以我也在使用“current_picture.posts.where(active:true,post_id:params[:id])。take!”在其他地方,应该用不同的方式写吗?我已经更新了我的答案。根据文档,您可以找到用户的第一篇帖子,其
post\u id
等于
params[:id]
,或者使用
active
属性设置为
true
当前图片。posts.create\u with(active:true)。find\u或\u create\u by(post\u id:params[:post\u id])
。谢谢。如果帖子存在,它会将现有帖子设置为true吗?我更新了答案,引用了源代码,指出确实可以传递多个属性来查找或创建。是的,但如果找到记录,它会用参数更新记录吗?
# rails/activerecord/lib/active_record/relation.rb
def find_or_create_by(attributes, &block)
  find_by(attributes) || create(attributes, &block)
end