2016-11-06 94 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