4

所以我正在尝试对模型的曾孙执行查询。关系就是这样...

锦标赛 > 比赛 > 比赛 > 球员

和锦标赛模型:

class Tournament < ActiveRecord::Base
  has_many :competitions, :dependent => :destroy
  has_many :matches, :through => :competitions
  has_many :players, :through => :matches

end

目前,我检索所有曾曾孙记录的方法是:

@results = @tournament.competitions.collect{|b| b.matches.collect{|c| c.players.with_win_count}}.flatten

这有效,但问题是它返回一个数组。我要做的是根据用户输入构建动态查询,而玩家表本质上是所有比赛的结果池,用户可以选择只过滤他想看的内容。我最终得到的是一个相当复杂的(取决于用户输入)查询,并且无法在数组上执行附加的 where 子句。为了让您更好地了解这是如何工作的,这是我的代码...

def results
   @tournament = Tournament.find(params[:id])
   @results = @tournament.all_great_grandchildren
   @results.where(params[:player_condition1]) if params[:player_condition1]
   @results.where(params[:player_condition2]) if params[:player_condition2]
   @results.where(params[:player_condition3]) if params[:player_condition3]

   if params[:match_condition]
     #Join to match table so we can query the match fields
     @results.join(:match)
     @results.where(params[:match_condition])
   end
   ....
   @results.order(params[:order]) if params[:order]
end

有没有办法在没有数组的情况下找到任何给定锦标赛的所有曾孙(玩家)记录,以便我可以继续调整记录?

4

2 回答 2

8

我认为@tournament.players如果您已经设置了上述关联,您应该直接调用将开箱即用。

于 2012-05-30T18:09:07.840 回答
1

尚纳普得到了它。我们在模型中定义“has_many”和“belongs_to”关联的原因是为了让我们可以轻松访问关联模型。

所以当你有一个名为锦标赛的锦标赛对象时,你可以这样做

competitions = tournament.competitions
matches = tournament.matches
players = tounaments.players

你也可以反方向走,从玩家对象开始。前任:matches = player.matches

使用 Active Record,您在处理关联时不必进行手动连接或原始 SQL 模型调用。快速阅读 Actice Records Associations 指南:

http://guides.rubyonrails.org/association_basics.html

于 2012-05-31T16:19:36.890 回答