Рельсы:сохраните запись через own_to и установите внешний ключ
-
21-09-2019 - |
Вопрос
Есть ли лучший способ написать этот код?Мне это просто не нравится, я чувствую, что есть что-то действительно «рельсовое», о чем я уже должен знать:
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.
Я уверен, что это должно быть достаточно просто, но я не знаю, как это сделать, в основном я хотел бы создать и назначить запись за одну операцию.
Решение
Это сделает то, что вы ищете.
def after_create
self.parent_in_use = ParentInUse.create!(parent_template.attributes)
end
Однако без других изменений это не принесет вам никакой пользы.Поскольку внешний ключ хранится в текущей модели, ActiveRecord не сохранит изменение, если эта ассоциация создана обратным вызовом after_create.Новый объект ParentInUse будет сохранен, но строка базы данных для текущей модели не будет обновлена соответствующим родительским_in_use_id.
Вызовите это как обратный вызов before_create, и все пойдет более гладко.