Странная вещь с выбором в Rails3 - PullRequest
1 голос
/ 10 января 2011

В моем приложении есть строка

Feature.all(:select=>"name", :conditions=> ['id IN (?)', feature_id_array]).map(&:name)

и работает нормально.
Когда я переписал его в синтаксис Rails3,

Feature.find(feature_id_array).select('name').map(&:name)

выдает ошибку: 1008 *

ArgumentError in AuthoringController#edit

   wrong number of arguments(1 for 0)

app/models/widgets/widget_feature.rb:82:in `select'

Итак, я сделал несколько случайных запросов в консоли и обнаружил, что:

Model.find(id_array).select(attribute)

возвращает ту же ошибку, а

Model.select(attribute).find(id_array)

отлично работает.

Может кто-нибудь сказать мне причину этого. Я почесал голову, но не нашел себе подходящую причину:

Model.select (атрибут) сначала извлечет все записи и выберет их имена, а затем найдет записи с соответствующими идентификаторами в id_array.

Если мне нужны имена только из 10 записей, то вышеупомянутый запрос сначала извлечет имена всех записей из таблицы, а затем даст мне необходимые 10 имен.


Отредактировано: ПРИМЕЧАНИЕ: следующий запрос работает нормально:

Model.where(:id => id_array).select(attribute)

Ответы [ 2 ]

4 голосов
/ 10 января 2011

Jatin,

Метод "find" не возвращает ActiveRelation, как where или select.Так как он возвращает объект ActiveRecord :: Base или массив, вы не можете добавить к нему предложения ActiveRelation.Ваши альтернативы работают, потому что «где» возвращает ActiveRelation (Model.where ()) также в более раннем отношении, find может вызываться по ActiveRelation (Model.select (). Find () - работает).

Так что используйте ActiveRelations или используйте find, но будьте осторожны при смешивании обоих.Если вы смешаете оба варианта, убедитесь, что поиск идет в конце.

0 голосов
/ 10 января 2011

Попробуйте

Feature.find(feature_id_array, :select => :name).map(&:name)

Это полезно для объяснения отличия запросов от Rails2: http://m.onkey.org/active-record-query-interface

...