什么是在轨范围/ named_scope?

我最近开始实习。 我的雇主在rails上使用ruby,而且我经常遇到需要查看的新语法。 我已经search了一个关于named_scope的很好的解释,但是到目前为止我发现的大部分博客文章都是给予高度评价的,而不是直接的定义或者介绍。

在rails上ruby究竟是named_scope(现在简称为scope)呢?

范围是集合的一个子集。 听起来很复杂? 事实并非如此。 想象一下:

你有用户。 现在,其中一些用户订阅了您的通讯。 您通过向用户数据库添加一个字段(user.subscribed_to_newsletter = true)来标记接收新闻简报的人员。 当然,你有时想要得到那些订阅你的通讯的用户。

当然,你可以这样做:

User.where(subscribed_to_newsletter: true).each do #something 

但是,不要总是写这个,你可以这样做。

 #File: users.rb class User < ActiveRecord::Base scope :newsletter, where(subscribed_to_newsletter: true) #yada yada end 

如果您使用的是Rails 4或更新的版本 ,请改为:

 #File: users.rb class User < ActiveRecord::Base scope :newsletter, -> { where(subscribed_to_newsletter: true) } #yada yada end 

这允许您通过简单地访问您的用户:

 User.newsletter.each do #something 

这是一个非常简单的例子,但在一般范围内可以是非常强大的工具,以方便您的工作。

看看这个链接: API说明

活动logging中的范围与类方法类似,但它们返回Relation对象,这意味着您可以调用另一个范围或活动logging查询方法。

例如,如果你有一个僵尸模型(僵尸表)与下面提到的范围方法,

 class Zombie scope :rotting, -> { where(rotting: true) } scope :fresh, -> { where('age < ?', 25) } scope :recent, -> { order(:created_at, :desc) } end 

你打电话

 Zombie.rotting.fresh.recent.limit(3) 

它翻译成SQL下面的,

 select "zombies.*" from "zombies" where "zombies"."rotting" = 't' and (age<20) order by create_at desc limit 3 

上面的例子是基于rails 4语法的

了解细节的最好方法是去API文档。

你会得到完整的细节和我们可以使用Scopes的方式。

范围的API文档

范围设定允许你指定常用的查询 (它可以被认为是长时间或最常用的查询的快捷方式),可以在关联对象或模型上作为方法调用被引用。 通过这些范围,您可以使用以前覆盖的每个方法,例如where,join和include。 所有的作用域方法都会返回一个ActiveRecord :: Relation对象 ,这个对象可以调用更多的方法(比如其他的作用域)。

为了定义一个简单的范围,我们在类内部使用scope方法,在调用这个范围的时候传递我们想要运行的查询:

 class Article < ActiveRecord::Base scope :published, -> { where(published: true) } end 

这与定义一个类的方法完全一样,你使用的是一个个人喜好的问题:

 class Article < ActiveRecord::Base def self.published where(published: true) end end 

请按照下面的链接进行完整的说明。 我希望这能帮到您。

http://guides.rubyonrails.org/active_record_querying.html

简单的解释。

想象一下,你有一个模型: 。 模型必须是单数。

现在想象你:

  • 想要世界上所有有红头发的人。
  • 想要世界上所有打板球的人

你可以通过使用示波器来获得这些特定类别的人! (请原谅双关)

那现在不是那么难吗?