2012-03-05 26 views
1

這是很長,所以我希望你能忍受我...Rails STI Mystery - 爲什麼類型在Class中改爲String?

我有一個叫做Update的模型,有兩個子類MrUpdate和TriggeredUpdate。使用單表繼承,將類型字段添加爲更新的字符串。

在我看來,我正在檢查決定顯示哪種類型。我認爲,因爲類型爲字符串,我應該怎麼做

<% if @update.type == 'MrUpdate' %> 

這種失敗,即,它評估爲假時,更新是一個MrUpdate。我注意到在這一點上,@ update.type.type是Class。 OK,什麼的,我想,所以我把它改爲:

<% if @update.type == MrUpdate %> 

和它的工作,即比較評估爲真當更新是一個MrUdpate。然後,我再次降低了在我看來,它再次失敗(即,當更新是一個MrUpdate時,它評估爲false)。

原來的罪魁禍首是幾個<%= link_to ...%>我用jQuery調用按鈕。如果我把這個代碼在我看來:

<br> 
<%= @update.type.type %><br> 
<%= @update.type %><br> 

<%= link_to 'New Note', new_note_path(:update_id => @update.id), :class => "ui-button" %> 

<br> 
<%= @update.type.type %><br> 
<%= @update.type %><br> 

我看到的是:

Class 
MrUpdate 

(the New Note button) 

String 
MrUpdate 

它從一個類改變爲一個字符串!那麼,我在這裏做錯了什麼或錯過了什麼?爲什麼應該link_to做到這一點?首先,我不清楚爲什麼它不是一個字符串,但後來真的很困惑,爲什麼它會改變......?!?任何幫助或解釋都會有幫助。我可以用一種方式在頂部編碼,另一種方式在底部編碼,但這種方式的瘋狂在於。我需要明白爲什麼會發生這種情況。

+1

你不覺得'type'是一種保留字嗎? – fl00r 2012-03-05 22:32:14

+0

是的,它是爲此目的而保留的。讓MrUpdate和TriggeredUpdate從Update中派生並將Type字段添加到Update中,就是我如何從讀過的內容中進行單個表繼承。 – 2012-03-06 14:28:54

回答

1

我想出了問題在這裏。感謝fl00r指明方向。

是的,類型是在Ruby 1.8.7中保留的,它告訴你調用它的對象的類。但是它也是事實,它是Rails中用來指示單表不一致的字段的名稱,並存儲了子類的每個實例的類的名稱。

所以我天真地嘗試使用@ update.type訪問類型字段的值。但是,在視圖的頂部做了什麼,在Ruby中調用了Object類的類型方法。無論出於什麼原因,在link_to調用之後,它都會訪問updates表的type字段的值。

在試圖弄清楚這一點時,我在Rails控制檯中調用了@ update.type,並看到以下消息:「warning:Object#type is deprecated; use Object#class」。最後它記錄了我正在做的事情。當我將電話更改爲:

<% if @update.class == MrUpdate %> 

一切正常。我從來沒有看到通過Google發現的有關STI的任何頁面中確定類型的電話。儘管他們都推薦只使用一個控制器,但有時您必須確定您擁有的實例的類別。

那麼,愚蠢的錯誤 - 飛行員的錯誤。但也許這會幫助其他人被絆倒。

相關問題