2

2 つのテーブルの結合に問題があり、とても混乱しているので、次の例のように新しいプロジェクトを作成しました: http://guides.rubyonrails.org/association_basics.html#the-has_many-association

私のモデル

class Customer < ActiveRecord::Base
  has_many :orders
  attr_accessible :id, :name
end

class Order < ActiveRecord::Base
  belongs_to :customer
  attr_accessible :id, :count, :customer_id
end

移行注文テーブルでは、次の方法で実現された顧客テーブルへの参照があります。

t.references :customer

テーブルにいくつかのサンプル データを入力し、動作しているこの SQL クエリを実行します。

select * from customers inner join orders on customers.id = orders.customer_id;

Railsコンソールを開いてこのクエリを実行するよりも:

Customer.joins(:orders)

顧客のみの結果が得られますが、2 つのモデルのマージと適切な結果を期待しています。私が走るとき

Order.joins(:customer)

注文の結果のみを返します。

2 つのモデルのマージ結果を取得するオプションはありますか? アドバイスありがとう:)

4

2 に答える 2

1

顧客の注文にアクセスするには、次のようにします。

customers = Customer.joins(:orders)
customers.each do |customer|
  customer.orders #<= contains orders for this customer
end

逆に :

orders = Order.joins(:customer)
orders.each do |order|
  order.customer #<= contains the customer
end

を使用すると、内部結合を実行しているため、注文のない顧客を除外することに注意してくださいjoins...顧客を含める場合は、includes(:orders)代わりにを使用してください

于 2012-11-08T19:21:33.347 に答える
1

関連するテーブルをクエリに含めるには、:includesを使用します

Customer.includes(:orders)

クエリ条件で関連するテーブルのみを使用するには、:joinsを使用します

Customer.joins(:order).where(:unpaid => true)

ただし、別の問題があります。コンソールでdo'Customer.includes(:orders)'を使用しても、それがプライマリコールであるため、Customersのみが表示されます。ただし、注文情報を取得するための追加の呼び出しなしでデータを利用できます。「includes」と「joins」の両方を使用してビューがレンダリングされた後にログオンを調べると、呼び出し数の違いがわかります。

コントローラでさまざまな呼び出しを行い、次のように表示するとします。

<% @orders.each do |o| %>
  <%= customer.order.details %>
于 2012-11-08T19:48:29.180 に答える