named_scope и .first?

#ruby-on-rails-3 #named-scope

#ruby-on-rails-3 #именованная область

Вопрос:

Я могу вернуть коллекцию объектов, только с одним (:limit => 1), но есть ли способ вернуть только объект .first (), например, не внутри коллекции?

 named_scope :profile, :conditions => {:association => 'owner', :resource_type => 'Profile'}, :limit => 1    # => collection of 1 profile but I want the profile only NOT in a collection or array
  

обходной путь — просто применить .first() к результатам, но я бы просто хотел очистить код и сделать его менее подверженным ошибкам.

Комментарии:

1. Я должен был бы сказать, что голосование единогласное, это метод, и работает он довольно хорошо, впервые я вижу where(), довольно удобный. Спасибо всем.

Ответ №1:

Вероятно, вместо этого вам потребуется создать метод класса:

 def self.profile
  where(:association => 'owner', :resource_type => 'Profile').first
end
  

Обратите внимание, что в Rails 3 вы должны использовать where(...) синтаксис, и что при выполнении .first вам не нужно указывать ограничение.

Ответ №2:

Во-первых, если вы используете Rails 3, вы должны использовать scope вместо named_scope . То же самое, другое, ошибочное, название ( named_scope все еще будет работать, но оно устарело). Теперь, когда с этим покончено…

Область видимости (или именованная область видимости) принимает два аргумента (символ и либо лямбда-выражение, либо хэш) и определяет метод класса в этой модели, который возвращает ActiveRecord::Relation, поэтому вы можете привязать к нему методы.

first , как find или all , возвращает фактический результат из базы данных. По этой причине это не будет работать в области видимости.

Все, что сказано, вы можете определить свой собственный метод класса в вашей модели, который обеспечивает желаемое поведение (как уже ответили 2 человека, пока я печатал это). На самом деле это рекомендуется при использовании областей многими уважаемыми разработчиками в сообществе Rails. Поскольку использование scope макроса класса в любом случае просто определяет сами методы класса, на самом деле в этом нет недостатка, и это имеет преимущество гибкости (как в вашем случае здесь).

Комментарии:

1. ЛОЛ, я такой неудачник, я видел предупреждения об устаревании, но так и не понял (или не прочитал их!), что они были связаны с моими недавно добавленными named_scopes, спасибо, что помогли мне прозреть, перейдя на scope.

Ответ №3:

Определите метод класса для этого:

 def profile
  where(:association => "owner", :resource_type => 'Profile').first
end
  

first Уже выполняет неявное limit 1 выполнение запроса И упорядочивает его по первичному ключу таблицы, чтобы вы всегда получали первое.