Rails ActiveRecord: как узнать, найден ли или создан find_or_create_by?
Если я сделаю
widget = Widget.find_or_create_by_widgetid(:widgetid => "12345", :param2 => "folk")
и т.д. тогда как мне узнать, является ли newobj найденным или вновь созданным виджетом? Есть ли что-то, что я могу проверить условно на widget
, который скажет мне?
Ответы
Ответ 1
Я не верю, что есть способ узнать, был ли объект вновь создан или уже был там. Вместо этого можно использовать find_or_initialize_by_widgetid
, который не сохраняет новый объект. Затем вы можете проверить widget.new_record?
, который скажет вам, был ли объект сохранен или нет. Вам нужно будет поместить вызов сохранения в блок кода для нового объекта, но, как вы хотите сделать эту проверку, он не должен разрушать поток кода.
Итак:
widget = find_or_initialize_by_widgetid(:widgetid => "12345", :param2 => "folk")
if widget.new_record?
widget.save!
# Code for a new widget
else
# Code for an existing widget
end
Ответ 2
Рельсы 4
Теперь этот метод принимает блок, который передается для создания, поэтому я бы пошел с:
widget = Widget.find_or_create_by(:widgetid => "12345", :param2 => "folk") do |w|
# if you got in here, this is a new widget
end
Еще один способ сделать это в Rails 4:
widget = Widget.where(:widgetid => "12345", :param2 => "folk").first_or_initialize
if widget.new_record?
# this is a new widget
end
Ответ 3
В зависимости от того, что вы хотите сделать, вы можете использовать блок:
widget = find_or_create_by(widgetid: "12345") do |widget|
widget.param2 = "folk"
if widget.new_record?
# Code for a new widget.
else
# Code for an existing widget.
end
end