客户和卖家之间的Rails关联 - has_many:through或has_and_belongs_to_many

时间:2014-05-02 10:36:23

标签: ruby-on-rails activerecord associations has-many-through

我开始使用rails的项目,其中有产品客户卖家。每个卖家has_many products。每个客户has_many products。 (在我的情况下,每个客户一次只购买一个产品)。

我想知道谁是我的客户'卖方和卖方的客户知道,他们会通过购买一种产品来链接。

我应该在客户和卖家之间使用has_and_belongs_to_many关联吗?或者是双has_many through :products,例如:

卖家

has_many :clients through :products

Belongs_to :products

客户

has_many :sellers through :products

Belongs_to :products

为了避免belongs_to课程中有两个product,这可行吗?

class Client < ActiveRecord::Base

has_many :products, as: :productable

has_many :sellers, through: :products

end

class Seller < ActiveRecord::Base

has_many :products, as: :productable

has_many :clients, through: :products

end

class Product < ActiveRecord::Base

belongs_to :productable, polymorphic: true

end

提前感谢您的回答。

2 个答案:

答案 0 :(得分:1)

我会在这里使用 has_many :through

class Client < ActiveRecord::Base

has_many :products

has_many :sellers, through: :products

end

class Seller < ActiveRecord::Base

has_many :prodcuts

has_many :clients, through: :products

end

class Product < ActiveRecord::Base

belongs_to :client
belongs_to :seller

end
  

最简单的经验法则是你应该设置一个has_many   :如果你需要使用关系模型,通过关系   作为一个独立的实体。如果你不需要做任何事情   关系模型,设置一个可能更简单   has_and_belongs_to_many关系(虽然你需要记住   在数据库中创建连接表。)

     

你应该使用has_many:through如果你需要验证,回调,   或连接模型上的额外属性。

另请参阅 Guides ,以便在 HABTM has_many :through 之间进行选择

答案 1 :(得分:0)

我想从另一端接近你的问题:让我们从产品开始。我认为这将澄清很多事情。

所以你有三个模型:Seller, ClientProduct

Product有卖家和客户。在你想要的模型中:

class Product
  belongs_to :seller
  belongs_to :client
end

这意味着在产品表中我们有一列seller_idclient_id

Afaik产品需要始终拥有两者。所以这也意味着你不能在这里使用多态关联。至少不是你提出的方式。如果你写

 belongs_to :productable, polymorphic: true

您将添加字段productable_id和productable_type to your Product`模型。但这只是 1 链接(因此无论是卖家还是客户,但绝不是两者兼而有之)。你可以在这里引入一个链接表,所以产品可以链接到许多“产品”,但在你的情况下,我认为它是除了这一点。您知道某个产品有一个卖家和一个客户。

其次,现在已经确定,您的Product正是客户与卖家之间的链接表。因此,您不必引入新的链接表,只需使用已存在的链接表。

class Seller
  has_many :products
  has_many :clients, through: :products
end

class Client
  has_many :products
  has_many :sellers, through: :products
end

总之:

  • 使用has_many :through,因为您已将链接表作为模型。如果你不关心join-table(link-table),只使用habtm。
  • 你不能在这里使用多态关联,因为你需要两个链接(没有引入链接表,这看起来有点过分了)。我喜欢明确seller_idclient_id的明确性,清晰度和可读性,而且管理起来也更容易。