2017-10-24 13 views

答えて

1

これには2つの方法があります。あなたはrecordsと呼ばれるActiveRecordの関係を持っており、idを探していると仮定すると:

  1. あなたはActiveRecord::FinderMethods#findメソッドを使用できますが、これは、データベースへの別の呼び出しになります:

    records.find(id)

  2. あなたはRubyのEnumerable#findメソッドを呼び出してデータベースを使用せずにコレクションを検索することができます。

    records.find { |r| r.id == id }

彼らは同じ名前を共有しますが、我々は、上記の例では二つの異なるfindメソッドを呼び出しています。最初のデータベースはより多くのデータベースリソースを使用し、後者はより多くのアプリケーションサーバーリソースを使用します。私はどちらが最終的に速いかわからない。

+1

同じ名前を持っていても、[ActiveRecord :: FinderMethods#find](http://api.rubyonrails.org/v5.1/classes/ActiveRecord/FinderMethods.html#method-i-find)と後者は[Enumerable#find](http://ruby-doc.org/core-2.4.2/Enumerable.html#method-i-find)です。 – max

1
TableName.find(id) 

とする必要があります。

それとも、すでにアクティブレコードクエリ内のレコードの束を持っている場合は、のような既知のIDを持つものを引き出すことができます。

active_record_query = User.where(first_name: "Jim") 
record = active_record_query.where(id: record_id).first 
1

私は、ユーザーの結果セットを持っていると私はそのセットにID = 3を持つユーザーを見つけたいと仮定すると:もちろん

foo = User.all 
user3 = foo.find {|x| x.id == 3} 

あなたがIDを知っていれば、あなたはそれを見つけることができます。仮に私は、ユーザーテーブルを持っていると私は私がしたいユーザーのIDが3である知っている:

user3 = User.find(3) 
1

あなたはActiveRecord::FinderMethods#findと、データベースからのレコードを見つけることができます。

Thing.find(1)は、SELECT things.* FROM things WHERE things.id = 1のデータベースにクエリします。レコードが見つからない場合はActiveRecord::NotFoundErrorを発行してください。 FindはIDのリストと共に使用することもできます。

すでにデータベースからロードされているリレーションがある場合は、Enumerable#findまたはその別名#detectを使用します。 ActiveRecord :: RelationにはEnumerableが含まれているため、配列に明示的にキャストしていない場合でも、.to_aで動作します。

各エントリをenumに渡してブロックします。ブロック が偽でない最初のものを返します。一致するオブジェクトがない場合、ifnoneを呼び出し、指定された場合は 結果を返します。そうでない場合はnilを返します。

例:

[1,2,3,4].find(&:even?) # => 2 
User.all.load.find { |u| u.id == 1 } 
関連する問題