1

私のアプリでは、私はラインを持っています

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(attribute)は、最初にすべてのレコードをフェッチしてそれらの名前を選択し、次にid_arrayで一致するIDを持つレコードを検索します。

10レコードだけの名前が必要な場合、上記のクエリは最初にテーブルからすべてのレコードの名前を取得し、次に必要な10個の名前を取得します。


編集済み:注:次のクエリは正常に機能します。

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

2 に答える 2

4

ジャティン、

メソッド「find」は、where や select のように ActiveRelation を返しません。ActiveRecord::Base オブジェクトまたは配列を返すため、それに ActiveRelation 句を追加することはできません。「where」は以前の関係でも ActiveRelation (Model.where()) を返すため、代替手段が機能します。find は ActiveRelation (Model.select().find() - 動作) で呼び出すことができます。

したがって、ActiveRelations を使用するか、find を使用しますが、両方を混在させる場合は注意してください。両方を混在させる場合は、find が最後に来るようにしてください。

于 2011-01-10T06:20:57.780 に答える
0

試す

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

これは、クエリが Rails2 とどのように異なるかを説明するのに役立ちます: http://m.onkey.org/active-record-query-interface

于 2011-01-10T05:13:45.830 に答える