我知道我可以根据
中的数组查询最近的书籍 scope :recent_books, lambda {|since_dt| {:conditions=>{:created_at >= since_dt}}}
但是当我有一系列项目时,如何进行类似的查询,例如如果我想知道是否有任何记录与[date1,date2,date3等]数组中的日期相匹配
我认为必须有一个收集/注入/选择/地图y方法才会这样做,但我不确定从哪个读取它们。
答案 0 :(得分:16)
如果您将数组作为值传递,则ActiveRecord足够智能,可以比较包含在数组中。例如,
Book.where(:author_id => [1, 7, 42])
生成一个SQL查询,其WHERE
子句类似于:
WHERE "author_id" IN (1, 7, 42)
您可以在scope
中以与设置正常条件相同的方式利用此功能:
class Book < ....
# Rails 3
scope :by_author, lambda { |author_id| where(:author_id => author_id) }
# Rails 2
named_scope :by_author, lambda { |author_id
{ :conditions => {:author_id => author_id} }
}
end
然后你可以将一个ID或一组ID传递给by_author
,它就可以了:
Book.by_author([1,7,42])
答案 1 :(得分:4)
在Rails 4中,我可以使用这样的范围来检查数组属性中是否包含字符串:
scope :news, -> { where(:categories => '{news}') }
或者有一个论点:
scope :by_category, ->(category) { where(:categories => "{#{category}}") }