Ответ 1
В 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