10

我正在开发 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
4

2 回答 2

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])

更新:

根据源代码

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

因此,find_or_create_by在 Rails 4 中可以将多个属性作为参数传递是有道理的。

于 2013-07-28T04:43:17.707 回答
0

你可以这样做,

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

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

于 2015-05-20T11:21:32.463 回答