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