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)

这给了我只有客户的结果,但我希望合并两个模型和适当的结果。当我跑步时

Order.joins(:customer)

它只返回我的订单结果。

是否有检索两个模型的合并结果的选项?感谢您的建议:)

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)',它仍然只会向您显示客户,因为这是主要呼叫。但是,无需额外调用即可获得数据以获取订单信息。在使用“includes”和“joins”渲染视图后检查日志,您会看到调用次数的差异。

假设您在控制器中进行不同的调用并将以下内容放在您的视图中。

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