Where with symbol:my_id => nilを使用し、?異なります。なぜ誰かが私に理由を説明できますか?
MyTable.where("my_id = ? ", nil).first
SELECT `my_tables`.* FROM `my_tables` WHERE (my_id = NULL ) LIMIT 1
データを取得しません
MyTable.where(:my_id => nil).first
SELECT `my_tables`.* FROM `my_tables` WHERE (`my_tables`.`my_id` IS NULL) LIMIT 1
My_idがnullのデータを取得します。
レールで使用するためのベストプラクティスは何ですか?
私の質問については明確にしていないと思います。 my Railsアプリケーションでは、リクエストパラメータはnilです。既存のコーディングはMyTable.where(:my_id => params [:id])。firstテーブルには、my_idがnullそのため、テーブルからの最初のレコードが認識されずに取得されますまず第一に、はい、それはテーブル内のデータが不明瞭な問題です。
この問題を解決するために。 2つの解決策を見つける
解決策1
if params[:id].present?
MyTable.where(:my_id => params[:id]).first
end
解決策2
MyTable.where("my_id = ? ", nil).first
ご存知のように、(条件がどんどん)置かれると、アプリケーションは遅くなり、関数型プログラミングではなくなります。ソリューション2を試してみると、同じ結果が得られると期待しているので驚きます。
正しいSQL構文はmy_id IS NULL
、つまり、最初のスニペットを次のように変更すると、willが機能します。
MyTable.where("my_id IS ?", nil).first
どちらの構文も完全に問題ありません。それはあなた自身の好み次第です。ただし、それがパラメーターであり、nil
になるかどうかわからない場合は、次のように使用することをお勧めします。
MyTable.where(:my_id => parameter).first
Rails 4では、新しいハッシュ構文を使用して値をnullとして指定できます。
MyTable.where(my_id: nil).first
NULLのDBの場合、構文は次のようになります。
my_id IS NULL
したがって、次のように指定できます。
MyTable.where("my_id is NULL ").first
いわゆる「Railsマジック」だと思います。範囲を渡すことができます。
Client.where(:created_at => (Time.now.midnight - 1.day)..Time.now.midnight)
なる
SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00'
AND '2008-12-22 00:00:00')
またはサブセットを渡す場合
Client.where(:orders_count => [1,3,5])
Railsはやります
SELECT * FROM clients WHERE (clients.orders_count IN (1,3,5))