Rails условия ActiveRecord - PullRequest
       10

Rails условия ActiveRecord

9 голосов
/ 25 февраля 2010

Есть ли способ создать такое условие?

@products = Product.find(:all,
  :limit => 5,
  :conditions => { :products => { :locale => 'en', :id NOT '1' }, :tags => { :name => ['a','b']})

Я хотел бы перечислить все продукты, не включая продукт 1. Thx.

Ответы [ 4 ]

20 голосов
/ 25 февраля 2010

Рельсы 3

Используйте squeel gem.

Product.where(
  :products => { :locale => 'en', :id.not_in => '1' }, 
  :tags => { :name => ['a','b']}
).limit(5)

Рельсы 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']}
)
9 голосов
/ 13 мая 2010

Другой способ - использовать 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)
9 голосов
/ 25 февраля 2010

Это должно быть примерно так. Исходный запрос был не совсем понятен, адаптируйте его под свои нужды.

@products = Product.find(:all,
  :limit => 5,
  :conditions => ["locale = ? AND id <> ? AND tags.name IN (?)", "en", 1, ['a','b'],
  :joins => "tags"
)
2 голосов
/ 07 декабря 2012

Рельсы 3.2.9


Контроллер

  @products = Product.english_but_not(1).with_tags('a','b').limit(5)

Модель

class Product < ActiveRecord::Base
  attr_accessible :locale
  has_many :tags
  scope :english, -> { where(:locale => 'en') }
  scope :except_id, ->(id) { where(arel_table[:id].not_eq(id)) }
  scope :english_but_not, ->(id) { english.except_id(id) }
  scope :with_tags, ->(*names) { includes(:tags).where(:tags => {:name => names}) }
end
...