Rails ActiveRecord conditions

后端 未结 4 1216
误落风尘
误落风尘 2020-12-15 11:26

Is there a way to create a condition like this?

@products = Product.find(:all,
  :limit => 5,
  :conditions => { :products => { :locale => \'en\'         


        
相关标签:
4条回答
  • 2020-12-15 11:51

    It should be something like this. The original query wasn't really clear, adapt it to your needs.

    @products = Product.find(:all,
      :limit => 5,
      :conditions => ["locale = ? AND id <> ? AND tags.name IN (?)", "en", 1, ['a','b'],
      :joins => "tags"
    )
    
    0 讨论(0)
  • 2020-12-15 11:55

    Rails 3.2.9


    Controller

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

    Model

    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
    
    0 讨论(0)
  • 2020-12-15 12:08

    Rails 3

    Use squeel gem.

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

    Rails 2

    Use AR Extensions for this. It supports the following condition modifiers:

    * _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
    

    Now you can rewrite your query as follows:

    @products = Product.find(:all,
      :limit => 5,
      :joins => [:tags],
      :conditions => { :locale => 'en', :id_not => '1', :tags => { :name => ['a','b']}
    )
    
    0 讨论(0)
  • 2020-12-15 12:14

    Another way is to use the merge_conditions which turns the hash conditions into a string. Then you can add on whatever you want or call merge_conditions again with other options.

    hash_conditions = {:category => 'computers'}
    conditions = Product.merge_conditions(hash_conditions) + ' AND products.id NOT IN(1139) '
    products = Product.find(:all, :conditions => conditions)
    
    0 讨论(0)
提交回复
热议问题