Ruby on rails 如何在模型中对一组项使用命名范围?

Ruby on rails 如何在模型中对一组项使用命名范围?,ruby-on-rails,ruby,select,model,collect,Ruby On Rails,Ruby,Select,Model,Collect,我知道我可以根据数组查询最近的书籍,如中所示 scope:recents_books,lambda{}自| dt{:条件=>{:created_at>=自{u dt}}} 但是,当我有一个项目数组时,如何进行类似的查询,例如,如果我想知道在[date1、date2、date3等]数组中是否有与日期匹配的记录,该怎么办 我认为一定有一个collect/inject/select/mapy方法可以做到这一点,但我不确定从读取它们中选择哪一个。如果将数组作为值传递,ActiveRecord足够智能,可

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

scope:recents_books,lambda{}自| dt{:条件=>{:created_at>=自{u dt}}}

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


我认为一定有一个collect/inject/select/mapy方法可以做到这一点,但我不确定从读取它们中选择哪一个。

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

Book.where(:author_id => [1, 7, 42])
生成包含
WHERE
子句的SQL查询,类似于:

WHERE "author_id" IN (1, 7, 42)
您可以在
范围内利用此功能,方法与设置正常条件相同:

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

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

scope :news, -> { where(:categories => '{news}') }
或者用一个论点:

scope :by_category, ->(category) { where(:categories => "{#{category}}") }

虽然我知道rails2名为_scope
的语法发生了一些变化,但是lambda方法在rails2中可以工作吗?谢谢,迈克尔。我首先在Rails2中使用了这种语法,包括一些与数组匹配的命名作用域。您只需将
where
调用更改为
conditions
哈希。@Michaeldurrent我添加了一个示例,说明如何使用Rails 2进行操作。@David,您知道如何使用像[[1,2],[3,2]]这样的元组数组吗。我需要分别处理每个元组的第一个和第二个值。谢谢,这对我帮助很大。在{新闻}周围的{}使一切不同。我不熟悉那种语法。。
scope :by_category, ->(category) { where(:categories => "{#{category}}") }