2017-11-10 10 views
0

は、私は次のクエリを持っている...これはスコアを検索する際に正しいRailsクエリですか?

CourseRegistration.where(status: "Completed").where("score >= ?", "80") 

まず、はい、スコアフィールドには、DB内の文字列です。しかし、これは主に動作しますが、100点が返されていません。私は.where("score >= ?", "080")を照会することができ、私が望むように80から100までのすべての得点を返しますが、それはまったく正しいと感じます。私はこれをやるべき別の方法がありますか?あるいは、誰かがこのクエリがどのように動作しているかを正確に説明するために刺すかもしれないので、私はそれについてもっと気分がいい。

+0

スコアをテキストとして保存していますか? 「CourseRegistration.where(status: "Completed")。ここで( "score> =?"、80) ' – lad2025

+0

スコアデータ型は? –

+0

スコアは文字列です。 – Lumbee

答えて

2

これを行う方法は、score列を整数に変更して、正常に動作するようにすることです。あなたがそれを行うことができないなら、あなたは、クエリでスコアを唱えられる:もちろん

where("score::int >= ?", 80)   # PostgreSQL-specific casting syntax 
where("cast(score as int) >= ?", 80) # Standard SQL type cast 

scoreカラムは、クエリのこの種の例外を取得するつもりだ、非数値文字列を含めることができる場合あなたはそれを説明する必要があるかもしれません。そのようなデータをどのように説明するかは、あなたが扱わなければならない奇妙なデータに依存します。

+0

はい!最初の例が完璧に働くように、私はpostgresを使用しています。 – Lumbee

2

スコアの種類を整数に変更することをお勧めします。そして、あなたはこのようなあなたの移行ファイルを編集

rails g migration ChangeScoreType 

:あなたのような移行を生成することを行うことができます

class ChangeScoreType < ActiveRecord::Migration 

    change_column :course_registrations, :score, :integer, using: 'company_id::integer' 

end 

また、あなたは(テストする必要があります)クエリのINTとしてスコアをキャストすることができます。このようなもの:

CourseRegistration.where(status: "Completed").where("CAST(Score AS INT) >= ?", "80") 

希望、これは幸運です!

関連する問題