我开始使用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
提前感谢您的回答。
答案 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, Client
和Product
。
Product
有卖家和客户。在你想要的模型中:
class Product
belongs_to :seller
belongs_to :client
end
这意味着在产品表中我们有一列seller_id
和client_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_id
和client_id
的明确性,清晰度和可读性,而且管理起来也更容易。