web-dev-qa-db-ja.com

Rails where where nil value with condition

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を試してみると、同じ結果が得られると期待しているので驚きます。

26
Swe

正しいSQL構文はmy_id IS NULL、つまり、最初のスニペットを次のように変更すると、willが機能します。

MyTable.where("my_id IS ?", nil).first

どちらの構文も完全に問題ありません。それはあなた自身の好み次第です。ただし、それがパラメーターであり、nilになるかどうかわからない場合は、次のように使用することをお勧めします。

MyTable.where(:my_id => parameter).first
53
Mischa

Rails 4では、新しいハッシュ構文を使用して値をnullとして指定できます。

MyTable.where(my_id: nil).first
15
BookOfGreg

NULLのDBの場合、構文は次のようになります。

my_id IS NULL

したがって、次のように指定できます。

MyTable.where("my_id is NULL ").first
9
leenasn

いわゆる「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))

その他

0
Bohdan