0

私は最初のものをしました、そして私がそれを正しくしたかどうかチェックしたいですか?また、2番目のRubyORMを実行する方法がわかりません。テーブル「customers」と「orders」に対する次の2つのアクティブなレコード定義について考えてみます。注文テーブルには、「customers」の主キーを参照する外部キー「cust_key」があります。これは「cust_key」とも呼ばれます。

Table:
customers-
          cust_key
          address

orders-
          order key
          cust_key
          order_priority
          total_price

1 class Customer < ActiveRecord::Base
2 set_table_name "customers"
3 set_primary_key "cust_key"
4 has_many :orders, :foreign_key => "cust_key”
5 End

1 class Order < ActiveRecord::Base
2 set_table_name "orders"
3 belongs_to :customer, :foreign_key => "cust_key"
4 set_primary_key "order_key”
5 end

Consider the following piece of Ruby-on-Rails code.
1 <table>
2 <% Customers.all.each.do |c| %>
3 <tr>
4 <td><%= c.address %></td>
5 <td><%= c.orders.count() %></td>
6 </tr>
7 <% end %>
8 </table>

質問:

  1. このRuby-on-Railsを実行した結果のSQLクエリを提供します。合計でいくつのSQLクエリが実行されますか?

2クエリ
SELECTアドレスFROM顧客

     SELECT COUNT(*) FROM orders where orders.cust_key= customers.cust_key;
  1. 1つのSQLクエリのみを発行し、上記のRuby-on-Railsフラグメントと同一のhtmlを作成するjspフラグメントを記述します。
4

1 に答える 1

0

これは古い質問であることは知っていますが、おそらく忘れているでしょうが... 変更した場合:

<% Customers.all.each.do |c| %>
  <tr>
    <td><%= c.address %></td>
    <td><%= c.orders.count() %></td>
  </tr>
<% end %>

<% Customers.includes(:orders).each.do |c| %>
  <tr>
    <td><%= c.address %></td>
    <td><%= c.orders.length %></td>
  </tr>
<% end %>

1 回の SQL 呼び出しで顧客情報を表示します。

includesメソッドは、結合を含む単一のクエリを使用するように要求を変更し、すべての顧客を対応する注文レコードと共に収集します。

count ではなく length を使用していることに注意してください。count は各 customer (c) オブジェクトの SQL カウントを呼び出すのに対し、length は最初の SQL 呼び出しで既に収集された注文データの長さを調べます。

于 2015-03-26T09:41:12.170 に答える