Rails ActiveRecord创建或查找

ny9*_*y95 10 ruby activerecord ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

zea*_*soi 22

Rails的4.0版本说明指的是find_by_ 还没有被弃用:

除了 find_by _...和find_by _... 之外的所有动态方法!不推荐使用.

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

@picture = current_picture.posts.find_or_create_by(post_id: params[:id])
Run Code Online (Sandbox Code Playgroud)

更新:

根据源代码:

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

因此,可以将多个属性作为参数传递给find_or_create_byRails 4.