多个 has_many: :通过关系到关联
Posted
技术标签:
【中文标题】多个 has_many: :通过关系到关联【英文标题】:Multiple has_many: :through relationship to association 【发布时间】:2018-04-23 13:35:03 【问题描述】:我有Sellers
的模型,他们拥有games
和unlimited_games
,其他players
可以购买。我想取消特定seller
的所有购买。我只有games
时的模型是:
class Seller
has_many :purchases, through: :games, dependent: :destroy
end
class Purchase
belongs_to :game
end
class Game
has_many :purchases
belongs_to :coach
end
更新模型
def UnlimitedGame
has_many :purchases
belongs_to :coach
end
def Purchase
belongs_to :game
belongs_to :unlimited_game
end
我可以通过@seller.purchases
获取该卖家的所有购买信息。现在我想扩展相同的功能以包含所有unlimited_games
所以@seller.purchases
包括unlimited_games
和games
。我试着做:
has_many :purchases, through: :games, dependent: :destroy, class_name: :purchases
has_many :purchases, through: :unlimited_games, dependent: :destroy, class_name: :purchases
【问题讨论】:
你如何想象rails应该知道purchases
何时引用games
和purchases
何时引用unlimited_games
?
当我特别想要它们时,我可以使用不同的名称来区分它,例如 unlimited_games_purchases
或 games_purchases
但我可以使用 purchases
来获取所有 games
包括 games
和unlimited_games
如果您已经定义了purchases
,然后立即重新定义了purchases
,那会是什么样子?
我知道那行不通,但这正是我不确定的部分。可能有一种方法可以包含多个关联以获得相同的table
。我现在找不到办法,但我希望这个问题能给我同样的答案
game
和unlimited_game
有什么区别?
【参考方案1】:
Supussing unlimited_games
本身并不是一个模型,而是 games
模型上的一个范围,那么您可以在 Seller
模型中执行类似的操作:
def unlimited_game_purchases
purchases.merge(Game.unlimited)
end
使用merge 合并两个查询的条件
顺便说一句,当然有一种方法可以使用相同的模型创建另一个关联,如果如您所说,卖家也有一个 has_many :unlimited_games
已经在工作,那么您的关联将如下所示:
has_many :unlimited_game_purchases, trough: :unlimited_games, source: :game
你可以选择你更好理解的方式
【讨论】:
以上是关于多个 has_many: :通过关系到关联的主要内容,如果未能解决你的问题,请参考以下文章