2016-04-26 3 views
0

私は、Railsに似たActiveRecordをORMとして使用するRuby 2.2.2アプリケーションを持っています。私は2つのテーブルを持っています。「ユーザー」と「アカウント」は「アカウント」がbelongs_to :userです。与えられたユーザのために、私は単に(user_accountsという名前の)Rubyのオブジェクトに熱心な負荷への「アカウント」テーブルの内容をしたいので、私のような操作を実行できます。実行find_by_product_name方法なし...ActiveRecordを使用してデータベーステーブルをロードしようとしています

user_accounts.find_by_product_name("nameofproduct") 

SQLクエリ。実行したSQLクエリの数を最小限に抑えるために、(特定のユーザに属する)「accounts」テーブルのすべてのエントリをRubyオブジェクトにプリロードするだけです。

私が読んだドキュメントの数にかかわらず、これを正しく行う方法を理解できません。これは可能ですか?もしそうなら、どうですか?

答えて

2

ORMにデータベースの再クエリをさせたくない場合は、Enumerable mixinによって追加されたselectメソッドを使用する方がよいと思います。 find_by_*メソッドを使用しようとすると、常に別のクエリが送信されると思います。

これはどのように実現できるかの例です。

# The accounts association will be loaded and cached the first time 
@user.accounts.select { |account| account.name == "nameofproduct" } 

# The next time, it is already loaded and will select from the previously loaded records 
@user.accounts.select { |account| account.name == "nameofanotherproduct" } 
+0

これはうまくいくようです。ありがとうございます。もう1つの最後の質問:この配列に手動でレコードを追加したいのであれば、それは可能でしょうか?つまり、私はuser.accountsをロードしたいと思うし、A)レコードを実際のDBに追加し、B)そのレコードをuser.accounts eager-loaded配列にテーブル全体をリロードせずに追加する? – JimboTwice

+0

はい、私はそれが何か問題であるとは思わない。 '@ user.accounts.build'または' @ user.accounts.create'のいずれかを使って新しいレコードをDBに追加すると、追加されたレコードはキャッシュされたレコードにすべてリロードされることなく追加されます。 – DanneManne

+0

素晴らしいです、ありがとうございます。私たちはこれに関して最後に1つの質問を持っています。個々のユーザーのUserテーブルとeager_loadアカウントから個々のレコードを読み込むことは可能ですか?これを行う方法を決定することはできません:もしUser.find_by_email( "[email protected]")なら、.eager_loadを活用することはできません。 Userテーブルから個々のエントリを読み込み、そのエントリのアカウントテーブルをeager_loadすることは可能ですか? – JimboTwice

1

Iのハッシュで検索のみO(n)を可能にする配列よりも(O(1)で)はるかに高速であるため、それは、代わりに、arrayhashに占める記憶だろう。

group_byは、そのハッシュの構築に役立ちます。

# assuming that @user.accounts returns all accounts 
user_accounts = @user.accounts.group_by(&:name) 

# querying the hash. use `first` to receive the first matching 
# account (even if there is only one) 
user_accounts['nameofproduct'].first 
+0

ありがとうございます。私がこれを実行すると、「間違った引数の数(1に対して0)が返されます」また、これを行うと、アカウントテーブルのすべての列を含むハッシュを作成することができます。 )? – JimboTwice

+0

私は申し訳ありませんが、 'group_by'の行に'& 'がありませんでした。私の更新された答えを見てください。その場合は。 – spickermann

関連する問題