2

この ActiveRecord ステートメントを実行しています

@items = Item.joins(:order => :person)
             .select('items.*').select('orders.*')
             .includes(:order => [:person, :organization])
             .order('created_at DESC')
             .limit(10)

そして、これらはクエリです:

SELECT items.*, orders.* FROM items INNER JOIN orders ON orders.id = items.order_id INNER JOIN people ON  people.id = orders.person_id WHERE items.deleted_at IS NULL ORDER BY created_at DESC LIMIT 10
Item Load (0.001ms) 

SELECT (trace)
SELECT orders.* FROM orders WHERE orders.deleted_at IS NULL AND orders.id IN (51, 50, 49, 48, 47, 46) ORDER BY orders.created_at DESC
Order Load (0.000ms) 

SELECT (trace)
SELECT people.* FROM people WHERE people.deleted_at IS NULL AND people.id IN (11, 22, 21, 19, 18)
Person Load (0.000ms)  

SELECT (trace)
SELECT organizations.* FROM organizations WHERE organizations.id IN (1)
Organization Load (0.000ms)  

SELECT items.*, orders.*最初のクエリで INNER JOIN を使用して既に SELECT されている場合、ActiveRecord がデータベースからデータを再選択するのはなぜですか? DBに戻らずにitem.orderを水和させるにはどうすればよいですか?

4

1 に答える 1

0

こんにちは、ActiveRecord 結合を使用すると、リレーショナル モデル間で一致するデータが常に検索されます。

例: Person に多くのアイテムがあり、Items が Person に属している場合、activerecord クエリは次のようになります。

Item.find(:all, :joins => :person, :select => "items.name, persons.full_name", :conditions => ["persons.full_name = ?", 'Allen', :order => "persons.created_at DESC"])

上記のコードは、full name = 'Allen' であるすべてのアイテム名と個人のフル ネームを返し、注文を created_at DESC または person テーブルに返します。そのため、Person の ID が Item の person_id 列と等しい場合、ログには多くの INNER JOIN クエリが存在します。

于 2013-05-04T16:06:05.047 に答える