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

Mic*_*ant 6 ruby select model ruby-on-rails collect

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

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

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

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

Dav*_*vid 16

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

Book.where(:author_id => [1, 7, 42])
Run Code Online (Sandbox Code Playgroud)

生成一个SQL查询,其WHERE子句类似于:

WHERE "author_id" IN (1, 7, 42)
Run Code Online (Sandbox Code Playgroud)

您可以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
Run Code Online (Sandbox Code Playgroud)

然后你可以传递一个ID或一组ID by_author,它只会工作:

Book.by_author([1,7,42])
Run Code Online (Sandbox Code Playgroud)


小智 5

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

scope :news, -> { where(:categories => '{news}') }
Run Code Online (Sandbox Code Playgroud)

或者有一个参数:

scope :by_category, ->(category) { where(:categories => "{#{category}}") }
Run Code Online (Sandbox Code Playgroud)