Rails, работающий с named_scope - PullRequest
1 голос
/ 21 июля 2009

Мне нужно выбрать динамические диапазоны цен, представленные в форме поиска. Как я должен подходить к этому с областями? Я ищу что-то вроде этого

Painting.price_range (['1..500', '2000..5000'])

SELECT * FROM paintings WHERE price BETWEEN 1..500 **OR** BETWEEN 2000..5000 etc.

С уважением. Асбьерн Морелл.

Ответы [ 2 ]

4 голосов
/ 21 июля 2009
named_scope :price_range, :conditions => ["(price BETWEEN 1 AND 500) OR (price BETWEEN 2000 AND 5000)"]

OR

named_scope :price_range, :conditions => ["(price ?) OR (price ?)", (1..500).to_s(:db), (2000..5000).to_s(:db)]

Динамический

named_scope :price_between, lambda { |from, to| { :conditions => ['price > ? AND price <= ?', from, to] } }

named_scope :price_between, lambda { |from, to| { :conditions => ['price BETWEEN ? AND ?', from, to] } }

->

MyModel.price_between(1,100)
2 голосов
/ 21 июля 2009

Вам нужно будет использовать лямбду на named_scope. Должно работать следующее:

  named_scope :price_range, lambda { |ranges|
    { 
      :conditions => ["(" + 
         ranges.collect {"price between ? and ?"}.join(" or ") + 
                      ")"] +
         ranges.collect {|r| [r.min, r.max]}.flatten 
    }
  }

Первый ranges.collect создает столько проверок "between ? and ?", сколько у вас есть диапазонов, а затем второй ranges.collect выравнивает диапазоны и добавляет их в качестве значений, которые необходимо обработать в условиях. Я заклеил скобки вокруг ор, чтобы быть в безопасности.

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