Rails: сохранить запись с помощью own_to и установить внешний ключ - PullRequest
1 голос
/ 19 ноября 2009

Есть ли лучший способ написания этого кода? Это просто не устраивает меня, я чувствую, что есть что-то действительно «похожее на рельсы», о котором я уже должен знать:

belongs_to :parent_in_use
belongs_to :parent_template

def after_create
  new_parent_in_use = ParentInUse.create!(self.parent_template.attributes)
  self.update_attribute(:parent_in_use_id, new_parent_in_use.id)
end

После создания записи я беру выбранный родительский шаблон и создаю на его основе запись parent_in_use. Таким образом шаблон может измениться, и запись in_use будет жить с моим объектом навсегда. Классы ParentInUse и ParentTemplate наследуются от Parent с использованием STI.

Я уверен, что это должно быть достаточно просто, но я не знаю, как это сделать, в основном я хотел бы создать и назначить запись за одну операцию.

1 Ответ

0 голосов
/ 19 ноября 2009

Это сделает то, что вы ищете.

def after_create 
  self.parent_in_use = ParentInUse.create!(parent_template.attributes)
end

Однако без других изменений это не принесет вам пользы. Поскольку внешний ключ хранится в текущей модели, ActiveRecord не сохранит изменения, если эта связь будет создана обратным вызовом after_create. Новый объект ParentInUse будет сохранен, но строка базы данных для текущей модели не будет обновлена ​​с соответствующим соответствующим parent_in_use_id.

Назовите его как обратный вызов before_create, и все пойдет более гладко.

...