Подтвердить что ты не робот

Rails ActiveRecord: как узнать, найден ли или создан find_or_create_by?

Если я сделаю

widget = Widget.find_or_create_by_widgetid(:widgetid => "12345", :param2 => "folk") 

и т.д. тогда как мне узнать, является ли newobj найденным или вновь созданным виджетом? Есть ли что-то, что я могу проверить условно на widget, который скажет мне?

4b9b3361

Ответ 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

find_or_create_by (атрибуты и блок)

Теперь этот метод принимает блок, который передается для создания, поэтому я бы пошел с:

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