Rails ActiveRecord 条件

Posted

技术标签:

【中文标题】Rails ActiveRecord 条件【英文标题】:Rails ActiveRecord conditions 【发布时间】:2011-01-20 23:54:15 【问题描述】:

有没有办法创建这样的条件?

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

我想列出不包括产品 1 的所有产品。 谢谢。

【问题讨论】:

【参考方案1】:

Rails 3

使用squeel gem。

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']
)

【讨论】:

【参考方案2】:

应该是这样的。原始查询不是很清楚,请根据您的需要进行调整。

@products = Product.find(:all,
  :limit => 5,
  :conditions => ["locale = ? AND id <> ? AND tags.name IN (?)", "en", 1, ['a','b'],
  :joins => "tags"
)

【讨论】:

我正在寻找“无字符串”解决方案,如哈希 ...。 不存在使用哈希的解决方案。【参考方案3】:

另一种方法是使用 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)

【讨论】:

【参考方案4】:

Rails 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

【讨论】:

以上是关于Rails ActiveRecord 条件的主要内容,如果未能解决你的问题,请参考以下文章

Rails排序宝石

基于条件的Rails关联查询

Rails 查询具有关联条件的多个主键

rails 获取多态类的所有关联类

防止Rails中父关系中的竞争条件

如何在我的 Rails 应用程序中避免竞争条件?