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 条件的主要内容,如果未能解决你的问题,请参考以下文章