8

我知道我可以根据数组查询最近的书籍,如

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

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

我认为必须有一个收集/注入/选择/映射 y 方法可以做到这一点,但我不确定从阅读它们中哪个。

4

2 回答 2

17

如果你传递一个数组作为值,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])
于 2011-11-16T16:38:17.137 回答
5

在 Rails 4 中,我可以使用如下范围检查字符串是否包含在数组属性中:

scope :news, -> { where(:categories => '{news}') }

或者有一个论点:

scope :by_category, ->(category) { where(:categories => "{#{category}}") }
于 2014-11-03T00:07:33.317 回答