Rails 3: Как объединить запросы или области для сложного запроса? - PullRequest
2 голосов
/ 24 декабря 2010

Я создаю очень простое приложение для событий, которое имеет title и start_date и end_date . Я хотел бы отфильтровать свой запрос, смешав некоторые значения, например: если start_date прошло, а end_date нет, событие активно и должно отображаться. Если обе даты прошли, ее тоже следует опустить. Я думаю, что области - это ответ, но мне удалось отфильтровать записи только в представлении, используя некоторые методы, показанные ниже.

Я действительно хотел бы отфильтровать запрос, который передается в контроллер (@events). Я хочу показать все события, которые активны, имеют будущую дату начала или прошлую дату начала, но все еще находятся в процессе (сегодняшняя дата находится в диапазоне между датой начала и конца)

EDITED

Я сделал несколько областей, которые возвращают каждую часть запроса. Цепочка их фактически вычитает результаты, а не объединяет их. Так что я использовал этот код, и на самом деле работает я не знаю, насколько это твердо или сухо. Выглядит немного уродливо для меня ... это достойный способ объединить запросы в рельсах 3?

scope :active, where("active = ?", true)
scope :not_over_or_in_progress, lambda { where("start_date < ? AND end_date > ? OR end_date IS NULL AND start_date > ? OR end_date IS NOT NULL AND start_date > ?", Date.today,  Date.today, Date.today, Date.today) }
scope :valid, not_over_or_in_progress.active.order("start_date DESC")

1 Ответ

1 голос
/ 24 декабря 2010

Попробуйте использовать области:

class Event < AR::Base
  scope :active, lambda { |date| where("start_date < ? AND end_date > ?", date) }
  scope :future, lambda { |date| where("end_date < ?", date }
  ...
end

# Console
> @active_events = Event.active(Date.today)
> @future_events = Event.future(Date.today)

См. http://guides.rubyonrails.org/active_record_querying.html

...