What is scope/named_scope in rails?

前端 未结 5 1044
耶瑟儿~
耶瑟儿~ 2020-12-02 04:08

I\'ve recently started an internship. My employer uses ruby on rails, and I frequently encounter new syntax that I need to look up to understand. I\'ve googled around for a

相关标签:
5条回答
  • 2020-12-02 04:55

    Scopes are nothing but class methods.

    Why use them?

    Scoping allows you to specify commonly-used queries(it can be considered as a shortcut for long or most frequently used queries) which can be referenced as method calls on the association objects or models. With these scopes, you can use every method previously covered such as where, joins and includes. All scope methods will return an ActiveRecord::Relation object which will allow for further methods (such as other scopes) to be called on it.

    To define a simple scope, we use the scope method inside the class, passing the query that we'd like to run when this scope is called:

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

    This is exactly the same as defining a class method, and which you use is a matter of personal preference:

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

    Please follow the following link for full description with example. I hope this will help you.

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

    0 讨论(0)
  • 2020-12-02 04:58

    scope in active record is like class methods but they return Relation object which means you can call another scope or active record querying method on it.

    For example, if you have a Zombie model (zombies table) with below mentioned scope methods,

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

    And you call

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

    It translates to the below in SQL,

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

    Example above is based on rails 4 syntax

    0 讨论(0)
  • 2020-12-02 04:58
    • Imagine you have a model: Person.

    Now imagine you :

    • want all the people in the world who have red hair.
    • want all the people in the world who play cricket

    You could get those particular classes of people by using a scope!

    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.
    

    Now that wasn't so hard was it?

    0 讨论(0)
  • 2020-12-02 05:04

    A scope is a subset of a collection. Sounds complicated? It isn't. Imagine this:

    You have Users. Now, some of those Users are subscribed to your newsletter. You marked those who receive a newsletter by adding a field to the Users Database (user.subscribed_to_newsletter = true). Naturally, you sometimes want to get those Users who are subscribed to your newsletter.

    You could, of course, always do this:

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

    Instead of always writing this you could, however, do something like this.

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

    If you're using Rails 4 or newer, do this instead:

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

    This allows you to access your subscribers by simply doing this:

    User.newsletter.each do #something
    

    This is a very simple example but in general scopes can be very powerful tools to easy your work.

    Check out this link: API Description

    0 讨论(0)
  • 2020-12-02 05:04

    The best way to understand about the details is to go to API Documentation.

    You'll get the complete details and the ways we can use Scopes.

    API Documentation of Scope

    0 讨论(0)
提交回复
热议问题