Подтвердить что ты не робот

Области и размеры в рельсах

Может кто-нибудь объяснить, что делает этот метод и что я могу передать ему?

scoped(options = nil)
Returns an anonymous scope.

А также что делает метод scope? Я не понимаю после прочтения документации.

4b9b3361

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

Ответ 2

Я использовал его в прошлом. Когда вы делаете прикованные вызовы к интерфейсу запросов 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

Надеюсь, вы поймете этот простой пример.