1. ホーム
  2. ruby-on-rails

[解決済み] Railsのコントローラからレコードが存在するかどうかをチェックする

2023-01-16 01:13:01

質問

私のアプリでは、ユーザーはビジネスを作成することができます。ユーザーが index アクションをトリガーすると BusinessesController に関連するビジネスかどうかをチェックしたいのです。 current_user.id :

  • はいの場合:事業を表示します。
  • noの場合: リダイレクトして new アクションにリダイレクトします。

これを使おうとしていたのですが

if Business.where(:user_id => current_user.id) == nil
  # no business found
end

しかし、ビジネスが存在しない場合でも常にtrueを返します...。

レコードがデータベースに存在するかどうかをテストするにはどうすればよいですか。

どのように解決するには?

なぜあなたのコードは動作しないのでしょうか?

このような場合 where メソッドは ActiveRecord::Relation オブジェクト(配列のようなもので、その中に where ), は空であっても構いませんが、決して nil .

Business.where(id: -1) 
 #=> returns an empty ActiveRecord::Relation ( similar to an array )
Business.where(id: -1).nil? # ( similar to == nil? )
 #=> returns false
Business.where(id: -1).empty? # test if the array is empty ( similar to .blank? )
 #=> returns true


少なくとも1つのレコードが存在するかどうかをテストするにはどうすればよいですか?

オプション1。 使用方法 .exists?

if Business.exists?(user_id: current_user.id)
  # same as Business.where(user_id: current_user.id).exists?
  # ...
else
  # ...
end


オプション2です。 使用方法 .present? (または .blank? の反対語である .present? )

if Business.where(:user_id => current_user.id).present?
  # less efficiant than using .exists? (see generated SQL for .exists? vs .present?)
else
  # ...
end


オプション3です。 if文での変数代入

if business = Business.where(:user_id => current_user.id).first
  business.do_some_stuff
else
  # do something else
end

このオプションは、いくつかのリンター(例えばRubocop)からはコードの匂いとみなされることがあります。

オプション 3b: 変数の割り当て

business = Business.where(user_id: current_user.id).first
if business
  # ...
else
  # ...
end

また .find_by_user_id(current_user.id) の代わりに .where(...).first


最良の選択肢です。

  • を使用しない場合 Business オブジェクト(s)を使用します。 オプション1
  • を使用する必要がある場合 Business オブジェクト(s)を使用します。 オプション 3