Что такое область / именованная область в rails?


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

Что именно named_scope (теперь просто называется scope) в ruby on rails?

5 72

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.

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

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

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

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

простое объяснение.

представьте, что у вас есть модель: человек. Модели должны быть единственными.

теперь представьте, что вы :

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

вы можете получить эти конкретные классы людей с помощью области! (прошу прощения за каламбур)

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