首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RAILS-4 - has_and_belongs_to_many

RAILS-4 - has_and_belongs_to_many
EN

Stack Overflow用户
提问于 2016-03-04 00:17:09
回答 1查看 202关注 0票数 1

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

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

代码语言:javascript
复制
 # 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

所以我不能做那样的事:

代码语言:javascript
复制
customer = Customer.create(name: "John")
seller = Seller.create(name: "Dave")    
customer.sellers = seller

我有个错误

代码语言:javascript
复制
 NoMethodError: undefined method `each' for #<Seller:0x0000000582fb18>

但我可以:

代码语言:javascript
复制
customer.sellers<< seller

但如果我这样改变卖家的名字

代码语言:javascript
复制
Seller.first.name = "Bud"

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

有可能做这样的事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-04 00:32:51

好的,首先,Seller.first.name = "Bud"不做任何更新数据库的事情,name属性是在Seller.first实例上设置的,该属性随后丢失,因为您没有将它分配给任何变量。

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

代码语言:javascript
复制
Seller.first.update name: "Bud"

为了用新值更新DB,或者(更有可能)类似于:

代码语言:javascript
复制
seller = Seller.first
seller.name = "Bud"
seller.save

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

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

代码语言:javascript
复制
customer.sellers.reload

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35785691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档