Ruby / Rails - неявно создавать родительскую запись при создании дочерней записи? - PullRequest
1 голос
/ 05 августа 2009

Хорошо, это немного необычно, но у меня есть ряд форм сбора данных, которые сохраняют данные в соответствующих моделях. Что я хочу сделать, так это автоматически вставить общую родительскую запись (журнал действий / событий - отдельная модель), которая будет общей для каждой формы. (Все формы сохранят неявную запись в этой модели перед сохранением дочерней записи). Поэтому последовательность сохранения должна быть следующей:

1) На каждой детализации фиксируют ввод пользователя 2) Создать новую родительскую запись, содержащую сводную информацию (идентификатор пользователя, тип записи, метка времени) 3) Зафиксируйте новое значение родительского PK для вставки (в качестве внешнего ключа) в подробную запись 4) Заполните подробную запись пользовательскими данными ввода и данными FK, затем сохраните 5) Фиксация (или откат)

Как я могу это сделать - где хуки для чего-то подобного? Очевидно, что для этого мне нужно переопределить поведение по умолчанию в Rails - кто-нибудь видел примеры, которыми они могут поделиться?

ТИА, Брендан

P.S. Прежде чем вы решите, что это басовый подход, мне нужно разобраться в случае использования, когда происходит какое-либо действие / значительное событие, но основная подробная информация недоступна.
(Это может произойти с внешне импортированными данными, когда будет создан только родитель). Сейчас я в первую очередь заинтересован в поиске решения Rails для этого.

1 Ответ

4 голосов
/ 05 августа 2009

Есть несколько способов добиться этого, в зависимости от того, как вы этого хотите.

Фильтр before_save в вашей модели записи ребенка,

class YourModel < ActiveRecord::Base
  before_save :create_parent

  def create_parent
    #do something here

  end

end

Наблюдатели за активной записью (следуют схеме наблюдения)

Это идет в вашем файле environment.rb


  config.active_record.observers = :yourmodel_observer

создать файл yourmodel_observer.rb

и код

  class YourModelObserver  < ActiveRecord::Observer

    def after_save(object)

    end

    def after_update(object)

    end
  end

...