Создание или обновление ассоциации 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.
Любые намеки мимо этого дорожного блока будут чрезвычайно оценены.
Спасибо заранее.
Ответы
Ответ 1
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
является в основном обычным активным объектом записи.
Ответ 2
Еще один способ сделать это с помощью трюка ruby OR-Equal
property.contract ||= property.build_contract
property.contract.update_attributes(some_attributes)
Ответ 3
Property.all.each do |f|
c = Contract.find_or_initialize_by(property_id: f.id)
c.update(some_attributes)
end
Я не знаю, лучшее ли это решение, но для меня это более лаконично