问题描述
在我的游戏项目中,我定义了几个模型:
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中修复)。您可以考虑在此范围内运行自定义查询以将事物连接起来。