我最近开始实习。 我的雇主使用Ruby on Rails的,和我经常遇到新的语法,我需要仰视理解。 我GOOGLE了周围named_scope的一个很好的解释,但什么到目前为止我发现大多是博客文章给予了褒奖,而不是直的定义或引进。
究竟是什么named_scope(现简称为范围)在Ruby on Rails的?
我最近开始实习。 我的雇主使用Ruby on Rails的,和我经常遇到新的语法,我需要仰视理解。 我GOOGLE了周围named_scope的一个很好的解释,但什么到目前为止我发现大多是博客文章给予了褒奖,而不是直的定义或引进。
究竟是什么named_scope(现简称为范围)在Ruby on Rails的?
作用域是一个集合的子集。 听起来很复杂? 事实并非如此。 想象一下:
你有一个用户。 现在,一些这些用户的订阅电子报。 您标记那些谁添加字段的用户数据库(user.subscribed_to_newsletter =真)收到简讯。 当然,你有时会想那些谁订阅了你的通讯用户。
你可以,当然,总是这样做:
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说明
范围,活动记录就像类的方法,但他们返回关联对象,这意味着你可以调用另一个范围或活动记录查询方法就可以了。
举例来说,如果你有一个僵尸模式(僵尸表)与下面提到的范围的方法,
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
上面的例子是基于轨道4的语法
要了解有关细节,最好的办法是去API文档。
你会得到完整的信息,我们可以使用范围的方式。
范围的API文档
作用域允许您指定常用的查询 (它可以被看作是快捷方式或长或最常用的查询),它可以作为方法调用的关联对象或模型被引用。 有了这些范围,你可以使用以前每次覆盖,如在哪里,联接和包括方法。 所有范围的方法会返回一个ActiveRecord :: Relation对象 ,这将允许其他方法(如其他范围内)就可以被调用。
要定义一个简单的范围内,我们使用范围方法的类里面,通过我们想运行时,这个范围就是所谓的查询:
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
现在想象你:
您可以通过使用范围受到人们特别是那些班!
Person.red_hair.cricket ## finds all people with red hair who play cricket
Person.red_hair ## finds all people with red hair
Person.cricket ## finds all people who play cricket.
既然没有那么难了呢?