Что такое scope / named_scope в рельсах? - PullRequest
90 голосов
/ 02 февраля 2011

Я недавно начал стажировку.Мой работодатель использует ruby ​​на рельсах, и я часто сталкиваюсь с новым синтаксисом, который мне нужно найти, чтобы понять.Я искал хорошее объяснение named_scope, но до сих пор нашел в основном посты в блогах, которые его высоко оценивают, а не просто определение или введение.

Что именно называется named_scope (теперь простоназывается область) в рубине на рельсах?

Ответы [ 5 ]

188 голосов
/ 02 февраля 2011

Область действия - это подмножество коллекции. Звучит сложно? Это не так. Представь себе:

У вас есть пользователи. Теперь некоторые из этих пользователей подписаны на вашу рассылку. Вы отметили тех, кто получает новостную рассылку, добавив поле в базу данных пользователей (user.subscribeed_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

28 голосов
/ 24 сентября 2014

область действия в активной записи аналогична методам класса, но они возвращают объект Relation, что означает, что вы можете вызвать для него другую область действия или метод запроса активной записи.

Например, если у вас есть модель Zombie (таблица зомби)с указанными ниже методами области действия,

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

Пример выше основан на rails4 синтаксис

7 голосов
/ 15 декабря 2015

Области - это не что иное, как методы класса.

Зачем их использовать?

Область видимости позволяет указать часто используемых запросов (можетследует рассматривать как ярлык для длинных или наиболее часто используемых запросов), на которые можно ссылаться как на вызовы методов для объектов или моделей ассоциации.С этими областями вы можете использовать каждый ранее описанный метод, например, где, объединяет и включает.Все методы области действия будут возвращать объект 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

7 голосов
/ 14 мая 2013

Лучший способ понять детали - перейти к документации API.

Вы получите полную информацию и способы использования Scopes.

Документация API области применения

1 голос
/ 27 июня 2016
  • Представьте, что у вас есть модель: Человек .

Теперь представь:

  • хочу, чтобы все люди в мире, у которых были рыжие волосы.
  • хочу, чтобы все люди в мире, которые играют в крикет

Вы можете получить эти конкретные классы людей, используя прицел!

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.

Теперь это было не так сложно, правда?

...