Rails - условия построения для использования в запросе - PullRequest
0 голосов
/ 15 сентября 2011

Мне обычно нравится создавать хэш условий, как показано ниже:

conditions = {}
conditions[:color] = "black"
conditions[:doors] = 4
conditions[:type] = "sedan"

Cars.find(:all, :conditions=>conditions)

Но как бы добавить диапазон дат для чего-то вроде:

year >= '2011-01-01' and year < '2011-02-01'

Ответы [ 3 ]

1 голос
/ 15 сентября 2011

Я предполагаю, что вы используете Rails 2.3.x, а year - это столбец даты.

conditions = {}
conditions[:color] = "black"
conditions[:doors] = 4
conditions[:type] = "sedan"
# create a date range
conditions[:year] = (Date.parse("2011-01-01")...Date.parse("2011-02-01"))

Car.all(:conditions => conditions)

Если вы хотите выполнять еще более сложные запросы в 2.3.x, используйте гем AR Extensions . Прочитайте эту статью для более подробной информации.

0 голосов
/ 15 сентября 2011

Если вы на Rails 3, почему бы не использовать AREL?

Cars.where(:color => "black").
     where(:doors => 4).
     where(:type => "sedan").
     where("year >= '2011-01-01'").
     where("year < '2011-02-01'")

Кстати, не используйте: введите в качестве имени поля. Rails использует это для STI.

На Rails 2.3 я просто собрал бы conditions в виде строки.

0 голосов
/ 15 сентября 2011

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

@cars = Cars.where(:color => "black")
@cars = @cars.where(:doors => 4)
@cars = @cars.where("year >= '2011-01-01'")
@cars = @cars.where("year <= '2011-02-01'")

Или вы можете просто объединить все это в один:

Cars.where(["color=? AND doors=? AND year >= ? AND year <= ?", "black", 4, "2011-01-01", "2011-02-01"]

ОБНОВЛЕНИЕ: Для Rails <3 </p>

@cars = Cars.scoped(:conditions => {:color => "black"})
@cars = @cars.scoped(:conditions => {:doors => 4})
@cars = @cars.scoped(:conditions => "year >= '2011-01-01'")
@cars = @cars.scoped(:conditions => "year <= '2011-02-01'")

ИЛИ

Cars.all(:conditions => ["color=? AND doors=? AND year >= ? AND year <= ?", "black", 4, "2011-01-01", "2011-02-01"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...