ruby-on-rails - Has_many 到 rails 中的 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
基本思想是用户可以看到游戏的门票(我生成了 10 张带有 game_id 和 user_id 但没有付款的随机门票),当他决定购买时,我为门票创建付款,允许我过滤购买的门票在游戏模型上定义的 has_many 关系。
现在,我的游戏类与用户没有直接关系,所以为了检查有多少玩家买了票,我可以这样做
Game.find(params[:id]).users.size
我认为这在逻辑上应该转化为这样的东西
Game.find(params[:id]).tickets.joins(:payments).map(&:user).uniq.size
但是,当生成票证的用户不止一个时,结果会有所不同。在第一种情况下,我看到 2 个用户(这是错误的,因为只有一个人实际购买了票),在第二种情况下,我正确收到了 1 个用户。我能够以其他方式修复它,但仍然让我感到困惑为什么会这样发生。
从我的研究中,我发现了某种关系
has_many :users, -> { distinct }, through: :paid_tickets
没有看到joins(:payments)
在paid_tickets has_many 关系中定义。我可以从字面上放任何东西而不是 :payments (比如joins(:asdasd)
),它会拿走所有的票,但仍然返回 2。
有谁知道为什么会这样?
解决方案
我想问题已经修复并合并到 master 中,但还没有稳定版本(应该在 6.0.3.4 中修复)。您现在可以考虑在此范围内运行自定义查询来加入事物。
推荐阅读
- javascript - 如何在使用 axios-cache-adapter 时获取缓存响应
- sql - 如何从100中获得百分比的薪水
- python - 在已经运行的 webdriver 上进行输入
- c - 在c中从堆栈中读取格式字符串失败
- react-native - React Navigation v5:用于标题屏幕交互的 useEffect()?
- python - 输出尺寸不匹配与 pytorch 中模型摘要报告的内容
- java - 加密或散列
- python - 使用 selenium 优化线程
- javascript - 从 Firebase Firestore 获取图像并将它们添加到“li”
- sql - 我们如何在 oracle 中表示重复的数字?