Rails 3 извлекает все записи великих внуков как коллекцию ActiveRecord

Поэтому я пытаюсь выполнить запросы на модели внуков. Отношения как то так...

Турнир> Соревнования> Матчи> Игроки

и модель Турнира:

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

Есть ли способ найти все записи правнуков (игроков) для любого турнира без массива, чтобы я мог продолжить подготовку записей?

2 ответа

Решение

Я думаю, что вы должны просто позвонить @tournament.players будет работать из коробки, если у вас есть настройки с вышеупомянутыми ассоциациями.

Чамнап получил это. Причина, по которой мы определяем ассоциации "has_many" и "own_to" в моделях, заключается в том, чтобы предоставить нам легкий доступ к моделям ассоциаций.

Поэтому, когда у вас есть объект Турнир, называемый турнир, вы можете сделать

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

Вы также можете пойти в обратном направлении, начиная с объекта игрока. Пример: matches = player.matches

С Active Record вам не нужно выполнять ручные объединения или вызовы необработанных моделей SQL при работе с ассоциациями. Быстро прочитайте руководство Ассоциации Actice Records:

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

Другие вопросы по тегам