2013-10-03 167 views
2

我得到了以下關聯:Rails的相關模型沒有建立

class User < ActiveRecord::Base 
    has_and_belongs_to_many :subscribers, :join_table => 'subscribers_users' 
end 

class Subscriber < ActiveRecord::Base 
    has_and_belongs_to_many :devices, :join_table => 'subscribers_devices' 
end 

class Device < ActiveRecord::Base 
    has_and_belongs_to_many :subscribers, :join_table => 'subscribers_devices' 
    has_many :device_attributes 
end 

class DeviceAttribute < ActiveRecord::Base 
    belongs_to :device 
end 

在用戶類,我創建方法是這樣的:

def self.create(params) 

    transaction do 

    # create user 
    user = User.new 
    user.assign_attributes params 

    # associate a device 
    device = Device.build_from_params(params.dup) 
    raise_if_invalid device 
    subscriber.devices.push device 

    # associate device_attributes to device 
    params[:buttons].each do |b| 
     # >>> problem here >>> 
     device.device_attributes.build({:button_id => b[:button_id]}) 
    end 

    user.save 
    end 

end 

上創建device_attributes線出現的問題設備的物體。當這條線被評論時,我的用戶被正確地創建以及它的相關對象(訂閱者和設備)。但是當我不評論它時,我的用戶只有一個用戶,就是這樣。它似乎停止了,並且不會與devce_attributes對象一起創建任何設備!

在控制檯中沒有錯誤..我真的很奇怪,怎麼了?

謝謝!

回答

0

我相信你需要在你的循環中創建的每個Device對象上調用savebuild方法實例化一個新對象,但實際上並未將其保存到數據庫中。有關更多詳細信息,請參閱this guide

device.device_attributes.build({:button_id => b[:button_id]}).save() 

current_device = device.device_attributes.build({:button_id => b[:button_id]}) 
current_device.save() 

應該做的伎倆。

+0

但是這應該是自動的(當父母被保存時,孩子對象被保存)根據這裏:http://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html,不是嗎? – TGI

+0

如果您的User.save調用發生在您的循環中,這可能會有效。由於它沒有被調用,所以每個Device對象都會超出範圍,並在你的循環中每次傳遞都會死掉。 – BrMcMullin