Моя модель соединения has_many through имеет нулевую ссылку после сохранения - PullRequest
3 голосов
/ 04 мая 2011

Я пытаюсь создать объект и добавить существующий объект в ассоциацию "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

1 Ответ

2 голосов
/ 07 мая 2011

После публикации сообщения об ошибке я получил помощь от одного из гуру Rails. Короче говоря, невозможно заставить работать так, как я думал.

Я решил продолжить с немного большим количеством кода контроллера, похоже, работает нормально:

def create
    @notification = Notification.new(params[:notification])
    @member = Member.find(params[:member_id])

    respond_to do |format|
      if @notification.save
        @member.notifications << @notification
        @member.save
        ...
...