Ответ 1
прицелы
Подобно Active Record, Mongoid позволяет вам определять области на вашем моделей в качестве удобства для фильтрации наборов результатов. Определены области действия на уровне класса, либо используя макрос области видимости, либо определяя класс методы, возвращающие объект критериев. Все области применения могут быть применены и к ассоциациям, раздел отношений.
Именованные области определяются на уровне класса с использованием макроса области и могут быть привязаны для создания наборов результатов в красивой DSL.
class Person
include Mongoid::Document
field :occupation, type: String
field :age, type: Integer
scope :rock_n_rolla, where(occupation: "Rockstar")
scope :washed_up, where(:age.gt => 30)
scope :over, ->(limit) { where(:age.gt => limit) }
end
# Find all the rockstars.
Person.rock_n_rolla
# Find all rockstars that should probably quit.
Person.washed_up.rock_n_rolla
# Find a criteria with Keith Richards in it.
Person.rock_n_rolla.over(60)
Обратите внимание, что определения оцениваются во время загрузки класса. Для оценки во время выполнения, вы захотите определить, используя proc или лямбда. В следующем примере первая дата устанавливается как дата загрузки класса, где вторая область задает дату в то время область действия называется.
scope :current, where(:start_date.lte => Date.today)
scope :current, -> { where(:start_date.lte => Date.today) }
методы класса
Для тех, кто предпочитает синтаксис стиля Data Mapper, методы класса, возвращающие критерии, также могут рассматриваться как области с возможностью привязки.
class Person
include Mongoid::Document
field :occupation, type: String
field :age, type: Integer
class << self
def rock_n_rolla
where(occupation: "Rockstar")
end
def washed_up
where(:age.gt => 30)
end
def over(limit)
where(:age.gt => limit)
end
end
end
# Find all the rockstars.
Person.rock_n_rolla
# Find all rockstars that should probably quit.
Person.washed_up.rock_n_rolla
# Find a criteria with Keith Richards in it.
Person.rock_n_rolla.over(60)
Именованные области и методы класса, которые возвращают критерии, могут быть соединены вместе - что красота монгольских мощных критериев API.
class Person
include Mongoid::Document
field :occupation, type: String
field :age, type: Integer
scope :washed_up, where(:age.gt => 30)
scope :over, ->(limit) { where(:age.gt => limit) }
def self.rock_n_rolla
where(occupation: "Rockstar")
end
end
# Same queries apply here as well.
Person.rock_n_rolla
Person.washed_up.rock_n_rolla
Person.rock_n_rolla.over(60)