我有两个型号,卖家和客户。 我希望它是一个有卖家的顾客,很多顾客可以拥有相同的卖家。
理想情况下,我希望可以做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中修改。
有可能制作类似的东西吗?
答案 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.first
)customer.sellers.first.name
将是"Bud"