多个 has_many: :通过关系到关联

Posted

技术标签:

【中文标题】多个 has_many: :通过关系到关联【英文标题】:Multiple has_many: :through relationship to association 【发布时间】:2018-04-23 13:35:03 【问题描述】:

我有Sellers 的模型,他们拥有gamesunlimited_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_gamesgames。我试着做:

has_many :purchases, through: :games, dependent: :destroy, class_name: :purchases

has_many :purchases, through: :unlimited_games, dependent: :destroy, class_name: :purchases

【问题讨论】:

你如何想象rails应该知道purchases何时引用gamespurchases何时引用unlimited_games 当我特别想要它们时,我可以使用不同的名称来区分它,例如 unlimited_games_purchasesgames_purchases 但我可以使用 purchases 来获取所有 games 包括 gamesunlimited_games 如果您已经定义了purchases,然后立即重新定义了purchases,那会是什么样子? 我知道那行不通,但这正是我不确定的部分。可能有一种方法可以包含多个关联以获得相同的table。我现在找不到办法,但我希望这个问题能给我同样的答案 gameunlimited_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: :通过关系到关联的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4找不到关联has_many,通过:关系错误

在一个模型上使用多个 has_many 关联

通过同一模型的两个 has_many 关系

Ruby-on-Rails:多个 has_many :通过可能吗?

Rails 4找不到关联has_many,通过:关系错误

has_many 在关联用户和项目时通过关联错误