選択方法について、以下の情報を出力配列レールActiveRecord例外なく

StackOverflow https://stackoverflow.com/questions/1441791

質問

いただいた場合、配列の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]}}

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top