2016-11-06 72 views
0

我试着让所有的数据,包括的has_many assosoation:如何使用包括在轨道上5.0活动记录

class Order < ApplicationRecord 
has_many :order_details 

class OrderDetail < ApplicationRecord 
belongs_to :order 

然后使用retrive数据:

@orders = Order.includes(:order_details) 

但输出它的唯一订单数据:

[ 
{ 
    id: 1, 
    customer_id: 4, 
    code: "c2306df9", 
    date: "2016-09-18T12:13:00.000Z", 
    downpayment: 500000, 
    amount: 3000000, 
    created_at: "2016-11-06T07:44:07.000Z", 
    updated_at: "2016-11-06T07:44:09.000Z" 
} 
] 

我的期望是数据订单和订单详细信息合并。关于在Rails 5.0上包含任何问题还是可能有其他方法?

May Sameone可以提供帮助。谢谢

+1

您的期望是不正确的。如果您运行'@orders.map {| x | x.order_details}'你会看到订单的细节。 –

回答

1

includes是一种告诉Rails急切加载关联记录以避免N + 1查询的方法。

这并不一定意味着Rails执行JOIN查询,也不意味着Rails只执行一个查询。 Rails通常会执行两个查询 - 一个用于原始请求,另一个用于一次加载所有关联的记录。 Rails根据关系类型和原始查询参数决定使用哪种策略。

即使Rails使JOIN并加载一个查询中的所有记录,输出仍将不包括该关联。输出的格式取决于如何配置输出序列化器,并且Rails在默认情况下不会将关联记录包括到输出中。

+0

感谢您的回复,所以最好的方法是使用查询字符串?请纠正我。 – Khalid

+1

'includes'是避免'N + 1'查询的强大方法。但是我不能告诉你做某件事的最佳方式,因为你从来没有告诉过我们你想要做什么。你只写过关于'includes'并没有做你认为应该做的事情。你能解释一下你试图达到什么目的吗?查询字符串*是什么意思? – spickermann

+0

感谢您的回应Spicker。问题解决了。谢谢你的手。 – Khalid

0

可能的话,你想达到什么是:

OrderDetail.joins(:order).map do |order_detail| 
    [order_detail.order.attributes, order_detail.attributes] 
end 
+0

感谢您的回复David – Khalid