【问题标题】:Has_many through has_many relation issue in railsHas_many 到 rails 中的 has_many 关系问题
【发布时间】:2020-10-14 16:10:23
【问题描述】:

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

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

没有看到在 paid_tickets has_many 关系中定义的joins(:payments)。我可以放任何东西而不是 :payments(比如joins(:asdasd)),它会拿走所有票,但仍然返回 2。

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

【问题讨论】:

    标签: ruby-on-rails activerecord has-many has-and-belongs-to-many


    【解决方案1】:

    我想the issue is already fixed 并被合并到 master 中,但还不是稳定版本(应该在 6.0.3.4 中修复)。暂时可以考虑在这个范围内运行自定义查询来加入事物。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多