Вопрос Ассоциации Рельсов - PullRequest
1 голос
/ 20 марта 2010

У меня есть три модели: User, RaceWeek, Race.

Текущие ассоциации:

class User < ActiveRecord::Base
  has_many :race_weeks
end

class RaceWeek < ActiveRecord::Base
  belongs_to :user
  has_many :races
end

class Race < ActiveRecord::Base
  belongs_to :race_week
end

То есть user_id - это внешний ключ в RaceWeek, а race_week_id - это внешний ключ в Race.

fastest_time является атрибутом модели Расы.

ВОПРОС: Какой оптимальный способ получить список пользователей, у которых самый высокий результат в гонке X?

Ответы [ 3 ]

1 голос
/ 20 марта 2010

Учитывая вашу текущую модель, должно работать следующее.

race_weeks = RaceWeek.find_by_sql(["SELECT user_id FROM race_weeks JOIN races ON races.race_week_id = race_weeks.id ORDER BY races.fastest_time desc LIMIT ?", X)
users = User.find(race_weeks.collect(&:user_id).uniq)

Я знаю, что для этого требуется два просмотра, но второй поиск должен быть очень быстрым, поскольку вы просматриваете только X записей по их первичному ключу.

1 голос
/ 21 марта 2010

Вы можете сделать это так:

users = User.all(:limit => X, :joins => {:race_weeks => :races}, :order => "reces.fastest_time DESC").uniq

Если вы правильно указали has_many :through связь, то вы можете сделать это так:

users = User.all(:limit => X, :joins => :races, :order => "reces.fastest_time DESC").uniq

В этом решении вы получаете то, что хотите, одним запросом, но двумя объединениями. И этот uniq метод не очень хорош, если вы не используете маленький X.

1 голос
/ 20 марта 2010

Что-то вроде:

 races = Race.all(:order => "fastest_time desc", :limit => X, :include => {:race_week => :user})
 users = races.map{|race| race.race_week.user}.uniq

Примечание: не проверял это.

...