Создание или обновление ассоциации has_one ActiveRecord

Я пытаюсь объединить ассоциации ActiveRecord, но я ударил немного кирпичной стены, и независимо от того, насколько я просматриваю документацию ActiveRecord, я не могу решить, как решить моя проблема.

У меня есть два класса:

Property -> has_one :contract  
Contract -> belongs_to :property

В моем классе контракта у меня есть метод create_or_update_from_xml

Сначала я проверяю, чтобы убедиться, что это свойство существует.

property_unique_id = xml_node.css('property_id').text
      property = Property.find_by_unique_id(property_unique_id)
      next unless property

И вот где я застрял, у меня есть хэш атрибутов для контракта, и то, что я хочу сделать, это что-то вроде:

if property.contract.nil?
  # create a new one and populate it with attributes
else
  # use the existing one and update it with attributes

Я знаю, как бы я это делал, если бы это был необработанный SQL, но я не могу придумать подход hte ActiveRecord.

Любые намеки мимо этого дорожного блока будут чрезвычайно оценены.

Спасибо заранее.

if property.contract.nil?
  property.create_contract(some_attributes)
else
  property.contract.update_attributes(some_attributes)
end

Должен сделать трюк. Когда у вас есть связь has_one или belongs_to, вы получаете методы build_foo и create_foo (которые похожи на Foo.new и Foo.create). Если ассоциация уже существует, то property.contract является в основном обычным активным объектом записи.

33
ответ дан 14 янв. '12 в 2:23
источник

Еще один способ сделать это с помощью трюка ruby ​​OR-Equal

property.contract ||= property.build_contract
property.contract.update_attributes(some_attributes)
8
ответ дан 02 мая '16 в 20:24
источник
Property.all.each do |f|
  c = Contract.find_or_initialize_by(property_id: f.id)
  c.update(some_attributes)
end

Я не знаю, лучшее ли это решение, но для меня это более лаконично

7
ответ дан 31 июля '13 в 11:37
источник