RAILS-4 - has_and_belongs_to_many

时间:2016-03-04 00:17:09

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

我有两个型号,卖家和客户。 我希望它是一个有卖家的顾客,很多顾客可以拥有相同的卖家。

理想情况下,我希望可以做customer.seller =卖家 使用belongs_to关联,卖方可以属于jsute one customer。 我使用has_and_belongs_to_many关联,虽然在我的客户中只能有一个卖家。

 # migration

 create_table :sellers do |t|
   t.string :name 
   t.timestamps null: false
 end

 create_table :customers do |t|
   t.string :name 
   t.timestamps null: false
 end

 create_table :customers_sellers, id: false do |t|
   t.belongs_to :customer, index: true
   t.belongs_to :seller, index: true
 end

 # models/seller.rb
 class Seller < ActiveRecord::Base
  has_and_belongs_to_many :customers
end

 # models/customer.rb
 class Customer < ActiveRecord::Base
  has_and_belongs_to_many :sellers
end

我不能做那样的事情:

customer = Customer.create(name: "John")
seller = Seller.create(name: "Dave")    
customer.sellers = seller

我有错误

 NoMethodError: undefined method `each' for #<Seller:0x0000000582fb18>

但我可以:

customer.sellers<< seller

但如果我改变了卖家的名字

Seller.first.name = "Bud"

我希望它也能在我的customer.sellers.name中修改。

有可能制作类似的东西吗?

1 个答案:

答案 0 :(得分:0)

好的,首先,Seller.first.name = "Bud"无法更新数据库,name实例上设置Seller.first属性,然后由于您没有丢失将它分配给任何变量。

因此,您需要将其更改为:

Seller.first.update name: "Bud"

为了使用新值更新数据库,或者(更可能)使用以下内容:

seller = Seller.first
seller.name = "Bud"
seller.save

这是第1步,实际上将该值保存到数据库中。

第二个问题是,如果您已经从数据库中读取customer.sellers,那么您的应用程序已经拥有存储在内存中的每个name的值,您需要至少重新加载从DB中记录以获取新值:

customer.sellers.reload

现在(我假设Seller.first也是customer.sellers.firstcustomer.sellers.first.name将是"Bud"