Rails ActiveRecord创建或查找

时间:2013-07-28 04:38:22

标签: ruby-on-rails ruby activerecord ruby-on-rails-4

我正在开发一个Rails 4应用程序,在我的post方法中为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

2 个答案:

答案 0 :(得分:22)

Rails 4.0 release notes表示find_by_ 未被弃用:

  

除了之外的所有动态方法 for find_by _...和find_by _...!是   弃用。

此外,根据Rails 4.0 documentationfind_or_create_by方法仍然可用,但已被重写以符合以下语法:

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

<强>更新

根据source code

# rails/activerecord/lib/active_record/relation.rb
def find_or_create_by(attributes, &block)
  find_by(attributes) || create(attributes, &block)
end

因此,可以将多个属性作为参数传递给Rails 4中的find_or_create_by

答案 1 :(得分:0)

您可以按照以下方式执行此操作,

@picture = current_picture.posts.where(post_id:params [:id])。find_or_create。

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