Rails 3. Как выполнить запрос «где» по виртуальному атрибуту? - PullRequest
2 голосов
/ 13 марта 2012

У меня есть две модели: ScheduledCourse и ScheduledSession.

scheduled_course has_many scheduled_sessions

scheduled_session belongs_to scheduled_course

ScheduledCourse имеет виртуальный атрибут ...

def start_at
  s = ScheduledSession.where("scheduled_course_id = ?", self.id).order("happening_at ASC").limit(1)
  s[0].happening_at
end

... виртуальный атрибут start_at проверяет все ScheduledSessions, которые принадлежат ScheduledCourse, и выбирает самый ранний из них. Таким образом, start_at - это дата начала первого сеанса.

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

Я не могу сделать следующее, потому что start_at - это виртуальный атрибут

@scheduled_courses = ScheduledCourse.where('start_at >= ?', Date.today).page(params[:page])

@scheduled_courses = ScheduledCourse.where('start_at <= ?', Date.today)

SQLite3::SQLException: no such column: start_at: SELECT  "scheduled_courses".* FROM "scheduled_courses"  WHERE (start_at >= '2012-03-13') LIMIT 25 OFFSET 0

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Вератикус прав; Вы не можете использовать виртуальные атрибуты в запросах.

Однако, я думаю, вы могли бы просто сделать:

ScheduledCourse.joins(:scheduled_sessions).where('scheduled_courses.happening_at >= ?', Date.today)

Он объединит таблицы, сопоставив идентификаторы, а затем вы можете посмотреть на столбец «происходящий_ател», который на самом деле является вашим атрибутом «start_at».

Отказ от ответственности: не тестировался, но должен работать.

3 голосов
/ 13 марта 2012

Вы не можете выполнять запросы SQL для столбцов, которых нет в базе данных.Вам следует подумать о том, чтобы сделать этот столбец реальной базы данных, если вы собираетесь выполнять запросы к нему вместо поддельного столбца;но если вы хотите выбрать элементы из этой коллекции, вы все равно можете это сделать.Вы просто должны сделать это в Ruby.

ScheduledCourse.page(params).find_all {|s| s.start_at >= Date.today}
1 голос
/ 13 марта 2012

Интересно, будет ли это решено подзапросом (подзапрос должен найти самую раннюю дату первым). Если это так, возможно, решение здесь может помочь указать полезное направление ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...