2014-09-19 21 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

相关问题