如何在模型中对项目数组使用命名范围?

我知道我可以查询基于数组的最新书籍

scope :recent_books, lambda {|since_dt| {:conditions=>{:created_at >= since_dt}}}

但是当我有一个项目数组时如何进行类似的查询,例如,如果我想知道是否有任何记录与[date1,date2,date3等]的数组中的日期匹配,该怎么办?

我认为必须有一个collect / inject / select / map y方法才能做到,但我不确定从哪个读取它们。

如果将数组作为值传递,则ActiveRecord足够智能,可以比较包含在数组中。 例如,

 Book.where(:author_id => [1, 7, 42]) 

生成一个带有WHERE子句的SQL查询,类似于:

 WHERE "author_id" IN (1, 7, 42) 

您可以像设置正常条件一样在scope利用此function:

 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}}") } 
Interesting Posts