什么是在轨范围/ 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
请按照下面的链接进行完整的说明。 我希望这能帮到您。
简单的解释。
想象一下,你有一个模型: 人 。 模型必须是单数。
现在想象你:
- 想要世界上所有有红头发的人。
- 想要世界上所有打板球的人
你可以通过使用示波器来获得这些特定类别的人! (请原谅双关)
那现在不是那么难吗?