2014-09-19 44 views
0

我有以下結構:如何將數據傳遞給連接表上創建

class User < ActiveRecord::Base 
    has_many :device_ownerships 
    has_many :devices, :through => :device_ownerships 
end 

class Device < ActiveRecord::Base 
    has_one :device_ownership 
    has_one :user, :through => :device_ownership 
end 


class DeviceOwnership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :device 
end 

然而DeviceOwnership也有SERIAL_NUMBER行

我想通過SERIAL_NUMBER值DeviceOwnership上創建。我知道我可以做類似

def create 
    user = User.create 
    device = Device.create 
    device_ownership = DeviceOwnership.create(:serial_numer => params[:device_serial_number], :device_id => device.id, :user_id => user.id) 
end 

這似乎不太優雅,我不知道是否有更好的解決方案。

回答

3

使用嵌套的屬性:

class User < ActiveRecord::Base 

    has_many :device_ownerships 
    has_many :devices, :through => :device_ownerships 
    accepts_nested_attributes_for :devices 
end 

class Device < ActiveRecord::Base 
    has_one :device_ownership 
    has_one :user, :through => :device_ownership 
    accepts_nested_attributes_for :device_ownership 

    def device_ownership_attributes=(attributes) 
    dev = build_device_ownership(attributes) 
    dev.user = self.user 
    end 
end 


class DeviceOwnership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :device 
end 

現在你可以一次用保存所有關聯的交易,如果你的PARAMS是這樣的:

pramas = {"user"=>{ "email"=>"[email protected]", "devices_attributes" =>{"0"=>{"name" => "Devise 1", "device_ownership_attributes"=>{"device_serial_number"=>"xyz"}}}} 
user = User.create(params['user']) 
# will save User, devise, and devise ownership all at once. 
+0

爽,謝謝你。我不知道如果我通過創建只有一個值的create創建DeviceOwnership,Rails將自動爲其分配device.id。 – Stpn 2014-09-19 20:17:47

+0

美麗之處在於,一切都將在MySQL交易中運行。這意味着如果某些驗證失敗,則不會保存任何內容,並且所有COMMIT都將恢復。 – Surya 2014-09-19 20:19:21