我的“has_many through”连接模型在保存后没有参考

时间:2011-05-04 19:20:13

标签: ruby-on-rails polymorphic-associations has-many-through

我正在尝试创建一个对象并将现有对象添加到“has_many through”关联中,但在保存我的对象后,在连接模型中将对新创建的对象的引用设置为nil。

具体来说,我正在创建一个Notification对象,并将一个预先存在的Member对象添加到Notification.members关联中。我正在使用嵌套资源,我正在使用以下相对URL调用通知控制器的新函数: /构件/ 1 /通知/新

在填写表单并提交之后,将调用create函数,根据我从Rails Associations guide的第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 个答案:

答案 0 :(得分:2)

发布bug report后,我得到了一位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
        ...