OP 実際のユースケース ソリューション
最も簡単な解決策は、DB 呼び出しを個別に行うのではなく、DB チェックとデータの取得を 1 つの DB クエリに結合することです。サンプル コードは近いものであり、意図を伝えていますが、実際の構文では少しずれています。
単純Truck.where("id = ?", id).select('truck_no').first.truck_no
にこのレコードが存在しない場合は、条件に一致するレコードが見つからない場合にレコードを取得する可能性があるため、呼び出しnil
時にエラーがスローされます。truck_no
first
nil
これは、クエリが基準に一致するオブジェクトの配列を返すため、first
その配列に対して (一致するレコードが見つからない場合) を実行するためですnil
。
かなりきれいな解決策:
# Note: using Rails 4 / Ruby 2 syntax
first_truck = Truck.select(:truck_no).find_by(id) # => <Truck id: nil, truck_no: "123"> OR nil if no record matches criteria
if first_truck
truck_number = first_truck.truck_no
# do some processing...
else
# record does not exist with that criteria
end
自分が何をしようとしているのかを他の人が正確に知ることができるように、それ自体を「コメント」するクリーンな構文を使用することをお勧めします。
Truck
本当にさらに一歩進んだ場合は、これを実行して意図を伝えるメソッドをクラスに追加できます。
# truck.rb model
class Truck < ActiveRecord::Base
def self.truck_number_if_exists(record_id)
record = Truck.select(:truck_no).find_by(record_id)
if record
record.truck_no
else
nil # explicit nil so other developers know exactly what's going on
end
end
end
次に、次のように呼び出します。
if truck_number = Truck.truck_number_if_exists(id)
# do processing because record exists and you have the value
else
# no matching criteria
end
このActiveRecord.find_by
メソッドは、条件に一致する最初のレコードを取得するかnil
、その条件でレコードが見つからない場合は戻ります。find_by
およびwhere
メソッドの順序が重要であることに注意してください。モデルselect
で を呼び出す必要があります。Truck
これは、メソッドを呼び出すと、ここで探しているものではないオブジェクトwhere
が実際に返されるためです。ActiveRelation
「find_by」メソッドについては ActiveRecord API を参照してください
「exists?」を使用した一般的な解決策 方法
他の貢献者の何人かがすでに言及しているように、このexists?
メソッドは何かの存在をチェックするために特別に設計されています。値を返すのではなく、DB にいくつかの基準に一致するレコードがあることを確認するだけです。
一部のデータの一意性または正確性を検証する必要がある場合に役立ちます。ActiveRelation(Record?) where(...)
良い点は、基準を使用できることです。
たとえばUser
、属性を持つモデルがemail
あり、電子メールが dB に既に存在するかどうかを確認する必要がある場合:
User.exists?(email: "test@test.com")
を使用する利点はexists?
、SQL クエリの実行が
SELECT 1 AS one FROM "users" WHERE "users"."email" = 'test@test.com' LIMIT 1
実際にデータを返すよりも効率的です。
実際に DB から条件付きでデータを取得する必要がある場合、これは使用する方法ではありません。ただし、単純なチェックにはうまく機能し、構文は非常に明確であるため、他の開発者はあなたが何をしているかを正確に知ることができます. 複数の開発者がいるプロジェクトでは、適切な構文を使用することが重要です。きれいなコードを書き、コード自体を「コメント」にします。