Я пытаюсь создать объект и добавить существующий объект в ассоциацию "has_many through", но после сохранения моего объекта ссылка на вновь созданный объект в модели соединения имеет значение nil.
Если быть точным, я создаю объект Notification и добавляю ранее существующий объект Member в ассоциацию Notification.members. Я использую вложенные ресурсы и вызываю новую функцию контроллера уведомлений, используя следующий относительный URL:
/ Участники / 1 / уведомления / новый
После заполнения формы и отправки вызывается функция create, и, как я понимаю из Руководства по связям с Rails , раздел 4.3.3 «Когда сохраняются объекты?», Ассоциации участников должны быть создан в базе данных при сохранении нового объекта уведомления:
"Если родительский объект (тот, который объявляет ассоциацию has_many) не сохранен (то есть new_record? Возвращает true), тогда дочерние объекты не сохраняются при добавлении. Все несохраненные члены ассоциации автоматически сохраняются при родитель сохранен. "
После создания объекта уведомления в базе данных была создана следующая запись:
select id, notification_id, notifiable_type, notifiable_id from deliveries;
1|<NULL>|Member|1
Я обошел проблему, сохранив объект уведомления перед добавлением объекта-члена в ассоциацию. Сначала это казалось правильным решением, но вскоре я обнаружил, что у него есть свои недостатки. Я не хочу сохранять уведомление без его ассоциации с членами, так как тогда мне нужно написать обходные пути для моих обратных вызовов, чтобы они не начали выполнять задачи с еще не действительным объектом уведомления.
Что я здесь не так делаю? Все советы приветствуются. : D
Модель
class Notification < ActiveRecord::Base
has_many :deliveries, :as => :notifiable
has_many :members, :through => :deliveries, :source => :notifiable, :source_type => "Member"
has_many :groups, :through => :deliveries, :source => :notifiable, :source_type => "Group"
end
class Member < ActiveRecord::Base
has_many :deliveries, :as => :notifiable
has_many :notifications, :through => :deliveries
end
class Delivery < ActiveRecord::Base
belongs_to :notification
belongs_to :notifiable, :polymorphic => true
end
# Group is not really relevant in this example.
class Group < ActiveRecord::Base
has_many :deliveries, :as => :notifiable
has_many :notifications, :through => :deliveries
end
Контроллер
class NotificationsController < ApplicationController
def create
@notification = Notification.new(params[:notification])
@member = Member.find(params[:member_id])
@notification.members << @member
respond_to do |format|
if @notification.save
...
end
end
end
end