私の知る限り、ActiveRecord の「where」メソッドは、属性ハッシュを使用して sql コマンドを作成するときの条件の順序を許可しません。例えば:
Student.where(:classroom_id => 1, :serial_no => 10, :name => 'Allen')
# SELECT `students`.* FROM `students` WHERE `students`.`name` = 'Allen' AND `subscriptions`.`serial_no` = 10 AND `subscriptions`.`classroom_id` = 1
次のように、配列で「where」を使用して、条件形式を強制できます。
Student.where(["classroom_id = ? AND serial_no = ? AND name = ?", 1, 10, 'Allen'])
# SELECT `students`.* FROM `students` WHERE (classroom_id = 1 AND serial_no = 10 AND name = 'Allen')
しかし、属性ハッシュを使用する柔軟性が失われます。実際には、順序で最初の 2 つの条件 (つまり、classroom_id と serial_no) のみを強制する必要があります。
注文の最初の 2 つの条件を強制し、特定のハッシュを使用して次の条件を割り当てる方法はありますか?
アップデート:
条件の順序を気にするのはなぜですか?
(classroom_id, serial_no) に複数列のインデックスを使用しているためです。次の 2 つのクエリを使用すると、インデックスが機能します。
SELECT * FROM students WHERE classroom_id = 1 AND serial_no = 10 AND name = 'Allen'
SELECT * FROM students WHERE classroom_id = 1 AND name = 'Allen'
ただし、次の 2 つでは機能しません (または十分に活用されません)。
SELECT * FROM students WHERE name = 'Allen' AND classroom_id = 1 AND serial_no = 10
SELECT * FROM students WHERE serial_no = 10 AND classroom_id = 1 AND name = 'Allen'