Рельсы:сохраните запись через own_to и установите внешний ключ

StackOverflow https://stackoverflow.com/questions/1762653

Вопрос

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

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, и все пойдет более гладко.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top