我知道我可以根据数组查询最近的书籍,如
scope :recent_books, lambda {|since_dt| {:conditions=>{:created_at >= since_dt}}}
但是当我有一个项目数组时如何进行类似的查询,例如,如果我想知道是否有任何记录与 [date1、date2、date3 等] 数组中的日期匹配怎么办?
我认为必须有一个收集/注入/选择/映射 y 方法可以做到这一点,但我不确定从阅读它们中哪个。
我知道我可以根据数组查询最近的书籍,如
scope :recent_books, lambda {|since_dt| {:conditions=>{:created_at >= since_dt}}}
但是当我有一个项目数组时如何进行类似的查询,例如,如果我想知道是否有任何记录与 [date1、date2、date3 等] 数组中的日期匹配怎么办?
我认为必须有一个收集/注入/选择/映射 y 方法可以做到这一点,但我不确定从阅读它们中哪个。
如果你传递一个数组作为值,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])
在 Rails 4 中,我可以使用如下范围检查字符串是否包含在数组属性中:
scope :news, -> { where(:categories => '{news}') }
或者有一个论点:
scope :by_category, ->(category) { where(:categories => "{#{category}}") }