Has_many 通过 has_many 关系问题 rails
Has_many through has_many relation issue in rails
在我的游戏项目中,我定义了几个模型:
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 关系过滤购买的门票。
现在,我的游戏 class 与用户没有直接关系,所以为了检查有多少玩家购买了门票,我可以这样做
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)
)它会拿走所有的票而且仍然 return 2.
有人知道为什么会这样吗?
我想 the issue is already fixed 并合并到 master 中,但还不是稳定版本(应该在 6.0.3.4 中修复)。你可以考虑运行 self-defined query in this scope to join things for now.
在我的游戏项目中,我定义了几个模型:
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 关系过滤购买的门票。
现在,我的游戏 class 与用户没有直接关系,所以为了检查有多少玩家购买了门票,我可以这样做
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)
)它会拿走所有的票而且仍然 return 2.
有人知道为什么会这样吗?
我想 the issue is already fixed 并合并到 master 中,但还不是稳定版本(应该在 6.0.3.4 中修复)。你可以考虑运行 self-defined query in this scope to join things for now.