高级AREL或只是通过关联搜索has_many的Rails查询

时间:2015-09-09 08:19:14

标签: ruby-on-rails activerecord has-many-through arel

#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"和" Bo",我将如何搜索团队模型以找到所有同时拥有Lisa和Bo的团队,而无需循环。所有has_many到查询示例都假设我只通过一个关联属性查找团队。但我想通过数组搜索。 [" Lisa"," Bo"]。

2 个答案:

答案 0 :(得分:0)

这有点难看,但应该有效地完成工作:

Team.where(:id => Player.where(:name => ["Lisa","Bob"]).
                         group(:team_id).
                         having("count(*) = 2").
                         pluck(:team_id))

答案 1 :(得分:0)

如果我理解正确,你在玩家,球队和球员表之间有很多很多关系。不幸的是,我找不到这个问题的纯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可以做同样的事情。