【问题标题】:How to pass data to join table on creation如何在创建时将数据传递给连接表
【发布时间】:2014-09-19 19:51:40
【问题描述】:

我有以下结构:

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

这个好像不太优雅,不知道有没有更好的解决方案。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 jointable


    【解决方案1】:

    使用嵌套属性:

    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
    

    如果您的参数如下所示,现在您可以在事务中一次保存所有关联:

    pramas = {"user"=>{ "email"=>"user@example.com", "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.
    

    【讨论】:

    • 酷,谢谢.. 我没有意识到如果我通过只在 create 上传递一个值来创建 DeviceOwnership,Rails 会自动将 device.id 分配给它。
    • 美妙的是,一切都将在 MySQL 事务中运行。这意味着如果某些验证失败,则不会保存任何内容,并且所有 COMMITS 都将被还原。
    猜你喜欢
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2014-08-01
    • 1970-01-01
    • 2022-01-20
    • 2017-03-21
    • 1970-01-01
    相关资源
    最近更新 更多