3

我試圖創建一個對象,並添加一個現有的對象到「has_many通過」關聯,但保存我的對象後,我的新創建的對象的引用設置在連接模型中爲零。我的「has_many通過」加入模型保存後沒有引用

具體而言,我創建了一個Notification對象,並將一個預先存在的Member對象添加到Notification.members關聯中。我使用嵌套的資源,我用以下相對URL調用通知控制器的新功能: /會員/ 1 /通知/新

填寫表單並提交後,創建函數被調用,從我從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 

回答

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 
     ... 
相關問題