2017-02-14 9 views
0

私は、書類を管理する必要があるユーザーを照会する必要があります。 ユーザーには最小および最大フィールドがあり、文書番号の最後の番号がこれらの2つの値の間にある場合、ユーザーは見つかる必要があります。 これは、範囲の作業の間にほとんどのクエリを丸める別の方法です。RubyのActiverecordクエリーを範囲と比較

私はプレーンSQLを使用する必要がある瞬間、次のように動作しますが、私はactiverecordクエリ(最初のエラー)または少なくともより安全なメソッド(2番目のエラー)を使用します。

わかりやすくするために、フィールドの名前を短くしました。

dosnr = 123456 
# error invalid identifier 
# User.where(dosnr.to_s[-1] => :min..:max) 

# error invalid character 6 
# User.where("#{dosnr.to_s[-1]} between ? and ?, min, max ") 

# sql works 
User.where("#{dosnr.to_s[-1]} between min and max ") 

sqlを使用せずに、またはすべてのレコードをループすることなく、または複数のwhere文を使用する必要なく、これを行う方法は?

+0

'dosnr'はユーザーテーブルの列ですか?データ型は何ですか?私はactiverecordでこれを行う方法はないと思っていますが、どのSQLを使用していますか? – Surya

+0

dosnrは変数ではなく、sqlは最後の行です – peter

+0

minとmaxは列であり、dosnr変数の最後の整数からすべてのユーザーをb/w minとmaxで見つける必要がありますか? – Surya

答えて

3

ActiveRecordは現時点では '<'、 '>'または 'BETWEEN'演算子の組み込みメソッドをサポートしていないため、SQLなしでは実行できません。しかし、安全ではない文字列補間を取り除くことができます:

User.where('? between min and max', dosnr.to_s[-1]) 
+0

クエリが間違っています。 'dosnr = 123456'の場合は、' SELECT "users"に変換されます。* FROM "users" WHERE 6 BETWEEN min and max'。 – Surya

+1

@スーリヤ私はそうは思わない。 – Ilya

+0

私の言葉を取ってはいけません。自分で試してみてください。 – Surya

関連する問題