選択方法について、以下の情報を出力配列レールActiveRecord例外なく
-
10-07-2019 - |
質問
いただいた場合、配列のidのように、
ids = [2,3,5]
か行
Comment.find(ids)
全てに働きます。ものがある場合はidが存在しない取得します。こgeneralyした場合のリストIdに一致するフィルターとしていた以上のように
current_user.comments.find(ids)
この場合に有効なコメントIDしかしいずれにも属さない与えられたユーザで見つけ出すことができず取得します。
たって find(:all, ids)
, ですが、すべての年のデータの記録です。
に反映されない問題を修である。
current_user.comments.select { |c| ids.include?(c.id) }
そしんでいただけるようになスーパー効率の悪い。
がより良い方法を選択 IDの配列 な例外以外の既存の名前を挙げた報告書を発表した。
解決
心配している例外を回避しているだけの場合、" find_all_by .."関数のファミリーは、例外をスローすることなく機能します。
Comment.find_all_by_id([2, 3, 5])
IDの一部が存在しない場合でも機能します。これは
で機能しますuser.comments.find_all_by_id(potentially_nonexistent_ids)
ケースも。
更新:Rails 4
Comment.where(id: [2, 3, 5])
他のヒント
更新:この回答はRails 4.xにより関連性があります
これを実行:
current_user.comments.where(:id=>[123,"456","Michael Jackson"])
このアプローチの長所は、 Relation
オブジェクトを返すことです。このオブジェクトに、さらに多くの .where
句、 .limit
を結合できます条項など、これは非常に役立ちます。また、例外をスローせずに存在しないIDを許可します。
新しいRuby構文は次のとおりです。
current_user.comments.where(id: [123, "456", "Michael Jackson"])
さらに制御が必要な場合(おそらくテーブル名を述べる必要がある場合)、次のこともできます。
Model.joins(:another_model_table_name)
.where('another_model_table_name.id IN (?)', your_id_array)
現在、.findおよび.find_by_idメソッドはRails 4で廃止されました。そのため、代わりに以下を使用できます。
Comment.where(id: [2, 3, 5])
一部のIDが存在しない場合でも機能します。これは
で動作しますuser.comments.where(id: avoided_ids_array)
IDを除外するためにも
Comment.where.not(id: [2, 3, 5])
を避ける例外を殺害をアプリのすべ漁その例外を大切にし、ご希望の動作を定義すアプリケーションされない場合は、idが見つかりません。
begin
current_user.comments.find(ids)
rescue
#do something in case of exception found
end
こちらの 詳細情報 例外にrubyなどがある。
他の条件を設定する場合は、named_scopeでも使用できます
たとえば、他のモデルを含める:
named_scope 'get_by_ids'、ラムダ{| ids | {:include => [:comments] 、: conditions => [" comments.id IN(?)&quot ;, ids]}}