Существует ли способ создать условие как это?
@products = Product.find(:all,
:limit => 5,
:conditions => { :products => { :locale => 'en', :id NOT '1' }, :tags => { :name => ['a','b']})
Я хотел бы перечислить все продукты не включая продукт 1. Спасибо.
Rails 3
Используйте гем squeel .
Product.where(
:products => { :locale => 'en', :id.not_in => '1' },
:tags => { :name => ['a','b']}
).limit(5)
Rails 2
Используйте для этого AR Extensions . Он поддерживает следующие модификаторы условий:
* _lt => less than
* _gt => greater than
* _lte => less than or equal to
* _gte => greater than or equal to
* _ne => not equal to
* _not => not equal to
Теперь вы можете переписать свой запрос следующим образом:
@products = Product.find(:all,
:limit => 5,
:joins => [:tags],
:conditions => { :locale => 'en', :id_not => '1', :tags => { :name => ['a','b']}
)
Это должно быть что-то вроде этого. Оригинальный запрос был не совсем понятен, адаптируйте его под свои нужды.
@products = Product.find(:all,
:limit => 5,
:conditions => ["locale = ? AND id <> ? AND tags.name IN (?)", "en", 1, ['a','b'],
:joins => "tags"
)
Другой способ - использовать merge_conditions, который превращает условия хеширования в строку. Затем вы можете добавить все, что хотите, или снова вызвать merge_conditions с другими параметрами.
hash_conditions = {:category => 'computers'}
conditions = Product.merge_conditions(hash_conditions) + ' AND products.id NOT IN(1139) '
products = Product.find(:all, :conditions => conditions)