#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
выполнение запроса И упорядочивает его по первичному ключу таблицы, чтобы вы всегда получали первое.