2011-01-10 2 views
1

В моем приложении, у меня есть линияWeird вещь с выбрать в Rails3

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

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

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

он бросает мне ошибку, говоря

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) 

ответ

4

Jatin,

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

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

0

Попробуйте

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

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

+1

Я прочитал эту ссылку раньше, и она говорит, что: «передача параметров hash, содержащих: условия,: include,: join,: limit,: offset,: order,: select,: readonly,: group,: having, : from,: lock для любого из методов класса ActiveRecord, теперь устарел. " –

 Смежные вопросы

  • Нет связанных вопросов^_^