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

时间:2011-11-16 16:32:07

标签: ruby-on-rails ruby select model collect

我知道我可以根据

中的数组查询最近的书籍

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

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

我认为必须有一个收集/注入/选择/地图y方法才会这样做,但我不确定从哪个读取它们。

2 个答案:

答案 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}}") }