簡體   English   中英

Rails 中的 Has_many 到 has_many 關系問題

[英]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

基本思想是用戶可以看到游戲的門票(我生成了 10 張帶有 game_id 和 user_id 但沒有付款的隨機門票),當他決定購買時,我為門票創建一個付款,允許我通過以下方式過濾購買的門票在 Game 模型上定義了 has_many 關系。

現在,我的 Game 類與用戶沒有直接關系,因此為了檢查 ie 有多少玩家購買了門票,我可以這樣做

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。

有誰知道為什么會發生這種情況?

我想問題已經修復並合並到 master 中,但尚未穩定版本(應在 6.0.3.4 中修復)。 您可以考慮在此范圍內運行自定義查詢以暫時加入事物。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM