10

私はRails 4アプリに取り組んでおり、APIのpostメソッドで、ユーザーが作成しようとしているものに基づいてレコードを見つけ、存在しない場合は作成し、パラメーターを更新する場合はそれを更新しますもっている。実際にこれを行うコードをいくつか書きましたが、実行には少し時間がかかります。おそらくより少ないコードまたはクエリで同じことを行う他の方法はありますか?

@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 に答える