在Rails中通过has_many关系发布has_many

问题描述

在我的游戏项目中,我定义了几个模型:

class Ticket
  belongs_to :user
  belongs_to :game

  has_and_belongs_to_many :payments,join_table: 'tickets_payments',association_foreign_key: 'transaction_id',class_name: 'Transaction'
end
class Transaction
  belongs_to :game

  has_and_belongs_to_many :tickets,join_table: 'tickets_payments'
end
class Game
  has_many :tickets
  has_many :paid_tickets,-> { joins(:payments) },class_name: 'Ticket' # # inner join would return only tickets that have related payment; if the ticket has related payment,it indicates that it was bought/paid
  has_many :users,-> { distinct },through: :paid_tickets
end

基本思想是,用户可以看到游戏的门票(我使用game_id和user_id生成了10张随机门票,但没有付款),当他决定购买门票时,我为门票创建了付款,从而可以进行过滤通过游戏模型上定义的has_many关系购买了门票。

现在,我的游戏类别与用户没有直接关系,因此为了检查(即有多少玩家购买了门票),我可以这样做

Game.find(params[:id]).users.size

我认为应该在逻辑上翻译成这样

Game.find(params[:id]).tickets.joins(:payments).map(&:user).uniq.size

但是,当有多个用户生成票证时,结果将有所不同。在第一种情况下,我看到2个用户(这是错误的,因为其中只有一个人实际购买了票),在第二种情况下,我正确地获得了1个。我能够以其他方式对其进行修复,但仍然令我困惑,这是为什么发生。

从我的研究中我发现了某种联系

has_many :users,through: :paid_tickets

看不到 paid_tickets has_many关系中定义的joins(:payments)。我可以按字面意思放置任何东西,而不是:payments(例如joins(:asdasd)),它将拿走所有票并仍然返回2。

有人知道为什么会这样吗?

解决方法

我假设the issue is already fixed已合并到master中,但不是稳定版本(应在6.0.3.4中修复)。您可以考虑在此范围内运行自定义查询以将事物连接起来。