所以我正在尝试对模型伟大的granchildren执行查询。这种关系就是这样......
锦标赛>比赛>匹配>玩家
和锦标赛模特:
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
有没有办法在没有阵列的情况下找到任何特定锦标赛的所有伟大的孙子(球员)记录,以便我可以继续调整记录?
答案 0 :(得分:8)
如果您使用上述关联进行设置,我认为您应该只需拨打@tournament.players
即可使用。
答案 1 :(得分:1)
查姆纳普得到了它。我们在模型中定义“has_many”和“belongs_to”关联的原因是为了让我们可以轻松访问关联模型。
因此,当你有一个名为锦标赛的锦标赛对象时,你可以
competitions = tournament.competitions
matches = tournament.matches
players = tounaments.players
您也可以从玩家对象开始向相反方向前进。例如:matches = player.matches
使用Active Record,您在处理关联时不必进行手动连接或原始SQL模型调用。快速阅读Actice记录协会指南: