#team.rb
has_many :players_teams
has_many :players, :through => :players_teams
#player.rb
has_many :players_teams
has_many :teams, :through => :players_teams
假设我有两个明星球员分别叫"Lisa"one_answers"Bo",我该如何搜索团队模型来找到所有同时拥有Lisa和Bo的球队,而不需要循环搜索。所有的has_many through查询示例都假设我只通过一个关联属性查找团队。但我想用数组来搜索。"丽莎"、"Bo"。
这有点难看,但应该能有效地完成工作:
Team.where(:id => Player.where(:name => ["Lisa","Bob"]).
group(:team_id).
having("count(*) = 2").
pluck(:team_id))
如果我理解正确的话,你在球员,球队和players_teams表之间有一个经典的多对多关系。不幸的是,我找不到一个纯粹的SQL解决方案,这个问题,但这个应该是轻量级的足够不给你的代码任何问题,即使我不知道它是否会规模巨大的数据库:
Team.where(id: (PlayersTeams.where(player_id: Player.find_by_name("Lisa")).pluck(:team_id) & PlayersTeams.where(player_id: Player.find_by_name("Bob")).pluck(:team_id)))
基本上你得到每个球员的团队,并找到他们的交集与ruby数组。我仍然想看看如何用纯SQL完成相同的事情
我想这就是你要找的东西:
ids = Player.where(name: ["Lisa", "Bob"]).pluck(:id)
Team.where(id: PlayersTeams.where(player_id: ids).group(:team_id).having("count(*) = ?", ids.count).pluck(:team_id))
一个查询,不包括给你的球员id。