Может кто-нибудь объяснить, что делает этот метод и что я могу передать ему?
scoped(options = nil)
Returns an anonymous scope.
А также что делает метод scope? Я не понимаю после прочтения документации.
Может кто-нибудь объяснить, что делает этот метод и что я могу передать ему?
scoped(options = nil)
Returns an anonymous scope.
А также что делает метод scope? Я не понимаю после прочтения документации.
В ActiveRecord все методы построения запросов (например, where
, order
, joins
, limit
и т.д.) возвращают так называемую область видимости. Только когда вы вызываете метод кикера, например all
или first
, выполняется встроенный запрос и возвращаются результаты из базы данных.
Метод класса scoped
также возвращает область. Возвращаемая область по умолчанию пустая, поэтому результирующий набор никоим образом не будет ограничен, что означает, что все записи будут возвращены, если запрос был выполнен.
Вы можете использовать его для предоставления "пустой" альтернативы, например, в примере query_by_date от MurifoX.
Или вы можете использовать его для объединения нескольких условий в один вызов метода, например, например:
Model.scoped(:conditions => 'id < 100', :limit => 10, :order => 'title ASC')
# which would be equivalent to
Model.where('id < 100').limit(10).order('title ASC')
Метод класса scope
позволяет вам определить метод класса, который также возвращает область, например, например:
class Model
scope :colored, lambda {|col|
where(:color => col)
}
end
который можно использовать следующим образом:
Model.colored
Хорошая вещь с областями заключается в том, что вы можете комбинировать их (почти), как вы пожелаете, поэтому абсолютно возможно:
Model.red.where('id < 100').order('title ASC').scoped(:limit => 10)
Я также настоятельно рекомендую прочитать http://guides.rubyonrails.org/active_record_querying.html
Я использовал его в прошлом. Когда вы делаете прикованные вызовы к интерфейсу запросов ActiveRecord
следующим образом:
Model.where(:conditions).where(:more_conditions).where(:final_conditions)
Каждый из них уже занят, что делает цепочку без проблем. Но скажем, у вас есть что-то вроде этого:
Model.query_by_date(date).query_by_user(user).query_by_status(status)
scope :query_by_date, lambda { |date|
case date
when "today"
where(:date => Date.today)
when "tomorrow"
where(:date => Date.tomorrow)
else
# Any value like '' or 0 or Date.whatever
end
}
Это приведет к ошибке, если параметр даты не существует сегодня или завтра. Он выберет последнее значение и попытается связать этот запрос со следующей query_by_user
, в результате получим undefined method default_scoped? for ''
. Но если вы поместите метод scoped
в условие else
, он будет работать без каких-либо недостатков, потому что вы говорите активируемому, что вы проходите через этот метод /named scope и не делаете никаких вызовов на where/find/other activerecord methods
, но возвратил объект с областью, поэтому вы можете продолжить цепочку запросов и т.д.
Так будет в конце концов.
else
scoped
end
Надеюсь, вы поймете этот простой пример.