需要帮助从Rails ActiveRecord获取查询列表

时间:2017-06-30 06:18:10

标签: ruby-on-rails activerecord rails-activerecord

我目前有三种型号:

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正在玩的名单)

我尝试过使用joinswhere方法,但不确定从哪里开始。任何答案和代码的解释将不胜感激!

2 个答案:

答案 0 :(得分:0)

我认为这应该有用

Roster.joins(match: :players).where('players.id = ?', my_player_id)

<强>更新

如果您执行.to_sql,您将获得等效的SQL查询,它只是使用您的associations inner join matchrosters首先使用foreign_key然后加入playersmatches,您的数据已准备就绪。现在,您只需提供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)
  • 注意! Rails提供了子模型的ID列表
  • 通知 .where(some_attribute: [ARRAY])将数组作为输入