Rails ActiveRecord Создать или найти

Я работаю над Rails 4 App и в своем методе 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

Ответ 1

заметки о выпуске Rails 4.0 означает, что find_by_ не был устарел:

Все динамические методы, кроме find_by _... и find_by _...! находятся осуждается.

Кроме того, согласно исходный код:

# 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.

Ответ 2

Вы можете сделать это следующим образом:

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

Здесь будет найден пост с параметрами [: id], и если он не найдет эту запись, тогда он создаст запись с текущим изображением с этим идентификатором.