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