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], и если он не найдет эту запись, тогда он создаст запись с текущим изображением с этим идентификатором.