2010-11-19 91 views
1

我有一個很漂亮的新問題,關於我創建的多對多關係,並從孩子中提取正確的數據。Rails - 多對多關係 - 數據問題?

我所擁有的是2個模型,一個叫做Order和另一個Status。我有一個名爲CreateOrdersStatuses的遷移來加入這兩個表。

在Ruby控制檯,我有通過父拉着孩子的信息困難,例如:

我已經指派我的第一個訂單的狀態,並且在控制檯給我下面讀出:

ruby-1.9.2-p0 > order.statuses 
=> [#<Status id: 1, name: "New", created_at: "2010-11-18 20:19:12", updated_at: "2010-11-18 20:19:12">] 

但是,對於我的看法,我想顯示訂單的狀態,所以我一直試圖在控制檯order.statuses.name如下 - 我本以爲這給我打印出來的「新」。相反,我只能在嘗試此操作時拉動「狀態」。例如:

ruby-1.9.2-p0 > order.statuses.name 
=> "Status" 

我試圖拉我的訂單的狀態名稱時,我相信我的問題是語法相關的?如果有必要,我可以提供模型/遷移,我只是認爲這是一個語法問題,因爲我是一個新手:)。

謝謝大家。

+0

只是一個問題,你肯定有多對一在這種情況下一對多的關係是正確的?如果一個訂單可以同時具有多個狀態,例如它可能同時是新建,正在進行和關閉,這對我來說聽起來不合適。我會申明,您將其更改爲belongs_to關聯,其中訂單belongs_to狀態並且狀態has_many命令。 – DanneManne 2010-11-19 18:12:24

回答

0

order.statuses.name不會返回「新」,因爲order.statuses是一個集合(您在第一個輸出中看到矩形括號)。所以在做order.statuses.name沒有意義。例如,你可以做order.statuses[0].name

儘管如此,order.statuses.name不會引發錯誤,因爲關聯實際上有一個方法name,它返回關聯類的名稱。在你的情況下,statuses關聯的類是Status,所以此方法返回「狀態」。

+0

非常感謝你的中微子。這確實有道理,先生,我真的很感激它。我基本上是要求它告訴我所創建的狀態集合的類的名稱,而不是要求數組中的第一個項目的「名稱」?再次感謝,我真的很感激。 – Kombo 2010-11-19 18:16:01

0

爲了避免過甜的數組索引符號「[0]」,你可以做,而不是:

order.statuses.first.name 

假設你的訂貨型號

has_many :statuses 
+0

它被設置爲has_and_belongs_to_many,所以這也可以工作。如果您知道一個與此相關的簡短問題:當我創建新訂單時,它們不會與任何狀態關聯。有沒有辦法設置它,所以當我創建訂單時,初始關係已設置爲我的第一個狀態?我沒有任何運氣在遷移中設置a:default,可能是因爲我的Order模型沒有包含狀態fk。 – Kombo 2010-11-19 22:25:17

+0

您可以在模型中添加一個名爲'initialize'的方法,您可以在其中設置關聯狀態(如果沒有設置)。 Rails中模型的默認值很棘手。還有像'before_initialize'或'after_initialize'這樣的回調鉤子,你可能想嘗試。 – nessur 2011-02-22 22:09:26