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: