Что такое область / именованная область в rails?
Я недавно начал стажировку. Мой работодатель использует ruby on rails, и я часто сталкиваюсь с новым синтаксисом, который мне нужно искать, чтобы понять. Я искал хорошее объяснение named_scope, но то, что я нашел до сих пор, - это в основном сообщения в блоге, дающие высокую оценку за это, а не прямое определение или введение.
Что именно named_scope (теперь просто называется scope) в ruby on rails?
5 ответов:
область-это подмножество коллекции. Звучит сложно? Это не так. Представьте себе:
пользователи. Теперь некоторые из этих пользователей подписаны на ваш информационный бюллетень. Вы отметили тех, кто получает рассылку, добавив поле в базу данных пользователей (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
если вы используете рельсы 4 или новее вместо этого:
#File: users.rb class User < ActiveRecord::Base scope :newsletter, -> { where(subscribed_to_newsletter: true) } #yada yada end
Это позволяет вам получить доступ к вашим подписчикам, просто делаю это:
User.newsletter.each do #something
Это очень простой пример, но в целом области могут быть очень мощными инструментами для облегчения вашей работы.
проверьте эту ссылку:описание API
область в active record похожа на методы класса, но они возвращают объект отношения, что означает, что вы можете вызвать другой метод запроса области или активной записи на нем.
например, если у вас есть модель зомби (таблица зомби) с указанными ниже методами области,
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.
вы получите полную информацию и способы использования областей.
область видимости позволяет указать часто используемые запросы(Это можно рассматривать как ярлык для длинных или наиболее часто используемых запросов), на которые можно ссылаться как на вызовы методов для объектов или моделей ассоциации. С помощью этих областей можно использовать все ранее описанные методы, такие как where, joins и includes. Все методы области будут возвращает объект 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
пожалуйста, перейдите по следующей ссылке для полного описания с примером. Я надеюсь, что это поможет вы.
простое объяснение.
представьте, что у вас есть модель: человек. Модели должны быть единственными.
теперь представьте, что вы :
- хочу, чтобы все люди в мире, которые имеют рыжие волосы.
- хочу, чтобы все люди в мире, которые играют в крикет
вы можете получить эти конкретные классы людей с помощью области! (прошу прощения за каламбур)
теперь это было не так сложно, не так ли?