我目前有三种型号:
class Match < ApplicationRecord
has_many :rosters, dependent: :destroy
has_and_belongs_to_many :players
end
class Player < ApplicationRecord
has_and_belongs_to_many :matches
end
class Roster < ApplicationRecord
belongs_to :match
end
假设我有一个特定玩家的ID,比如my_player_id
。我当前的数据库包含几个匹配,每个匹配有2个名单,每个名单有3个玩家。
如何获得属于玩家匹配的名单列表?(拥有my_player_id
的名单和my_player_id
正在玩的名单)
我尝试过使用joins
和where
方法,但不确定从哪里开始。任何答案和代码的解释将不胜感激!
答案 0 :(得分:0)
我认为这应该有用
Roster.joins(match: :players).where('players.id = ?', my_player_id)
<强>更新强>
如果您执行.to_sql
,您将获得等效的SQL查询,它只是使用您的associations
inner join
match
与rosters
首先使用foreign_key
然后加入players
到matches
,您的数据已准备就绪。现在,您只需提供where
子句即可获取属于特定player_id
的数据。
令人惊讶的是,以下也应该有效..
class Player < ApplicationRecord
has_and_belongs_to_many :matches
has_many :rosters, through: :matches
end
现在它就像
一样简单Player.find_by_id(player_id).rosters
答案 1 :(得分:0)
上述应该工作得很好,效率很高, 另一种解决方案是将其分解为两个查询
match_ids = @player.matct_ids
rosters = Roster.where(match_id: match_ids)
.where(some_attribute: [ARRAY])
将数组作为输入