什么是轨道范围/ named_scope?什么是轨道范围/ named_scope?(What is

2019-05-12 19:54发布

我最近开始实习。 我的雇主使用Ruby on Rails的,和我经常遇到新的语法,我需要仰视理解。 我GOOGLE了周围named_scope的一个很好的解释,但什么到目前为止我发现大多是博客文章给予了褒奖,而不是直的定义或引进。

究竟是什么named_scope(现简称为范围)在Ruby on Rails的?

Answer 1:

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

你有一个用户。 现在,一些这些用户的订阅电子报。 您标记那些谁添加字段的用户数据库(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说明



Answer 2:

范围,活动记录就像类的方法,但他们返回关联对象,这意味着你可以调用另一个范围或活动记录查询方法就可以了。

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

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的语法



Answer 3:

要了解有关细节,最好的办法是去API文档。

你会得到完整的信息,我们可以使用范围的方式。

范围的API文档



Answer 4:

作用域允许您指定常用的查询 (它可以被看作是快捷方式或长或最常用的查询),它可以作为方法调用的关联对象或模型被引用。 有了这些范围,你可以使用以前每次覆盖,如在哪里,联接和包括方法。 所有范围的方法会返回一个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



Answer 5:

  • 想象一下,你有一个模型:

现在想象你:

  • 希望所有的世界谁拥有红头发的人。
  • 希望所有在世界上谁打板球的人

您可以通过使用范围受到人们特别是那些班!

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.

既然没有那么难了呢?



文章来源: What is scope/named_scope in rails?