2010-06-14 104 views
4

我在報表和圖表之間有一個簡單的has_many/belongs_to關係。我遇到的問題是我的Chart模型是有孩子的父母。Rails對象繼承belongs_to

所以在我的報告模式,我有

class Report < ActiveRecord::Base 
    has_many :charts 
end 

我的圖表模式是父母,在餅圖,折線圖,條形圖全部來自圖繼承。我不確定belongs_to:報告屬於圖表模型或圖表模型的子項。我得到的錯誤,當我嘗試,因爲對象的類型爲「類」

未定義的局部變量或方法`#爲類<報告」訪問chart.report:0x104974b90>

圖表模型使用STI所以它的拉動說...圖表表格中chart_type列的'Gender'..我錯過了什麼?

EDIT

 Chart 
    /\ 
    Pie Line 
    /\ 
/ \ 
Gender Sex 

我(使用STI)實例化類型性別,或性別的對象。希望這可以幫助更多。

我有它,因爲提交時,因

@chart.update_attributes(params[:chart]) 

感覺自己居然PARAMS [:圖表]其PARAMS [:性別]或PARAMS [:性別]

+0

1.你的Chart表有一個'type'列嗎? 2.您的Pie和Line類是否從Chart繼承? ('Pie 2010-06-24 23:27:18

+0

1.是的,chart_type,我在模型中使用getter處理。是的,派從圖表繼承。 3.性別和性別是模型,因爲他們有自己的計算,他們會運行數據。每種模型或圖表類型都有一個計算值的方法,然後調用super來顯示,因爲它們都顯示相同類型的圖表(Pie) – Rabbott 2010-06-25 05:16:40

回答

2

你的問題是你有一個控制器接收所有這些不同類型的模型。當你使用Rails表單助手時,他們從實例中獲取對象類型並使用它填充參數。這意味着你有params[:gender]而不是params[:chart]

你可以通過重寫Rails用來生成表單的方法來解決這個問題。把下面的代碼在你的基本圖表類:

def self.model_name 
    name = "chart" 
    name.instance_eval do 
    def plural; pluralize; end 
    def singular; singularize; end 
    end 
    return name 
end 

現在,任何類,它是圖的一個孩子將被傳遞到您的接收行動params[:chart]

記住,改變對象的名字,因爲我上面概述了可能打破依賴它的一些插件/寶石的功能。你應該看看有多個控制器。而不是有ChartsController來接收所有的數據,有一個GenderChartsControllerLineChartsController。這有兩個好處:

  1. 你並不需要更改對象名稱
  2. 如果您需要自定義代碼在未來的某個特定類型的圖表,你不必添加條件語句,使它工作,因爲不同的控制器已經爲你隔離它。
1

如果所有的圖表類型屬於一個報告,然後將

 
belongs_to :report 

在父模型(即圖表模型在你的情況下,我猜測)。

+0

我得到相同的錯誤,在報表模型中是否需要其他內容?其他has_many:圖表? – Rabbott 2010-06-14 17:00:50

+0

你打電話Chart.report(這將給類錯誤,多數民衆贊成在錯誤),你只能調用該圖表模型對象 – 2010-06-14 17:11:34

+0

這樣的東西像「chart = Chart.find(:第一)」和「chart.report」 – 2010-06-14 17:12:07

2

您應該能夠只使用

class Report < ActiveRecord::Base 
    has_many :charts 
end 

class Chart < ActiveRecord::Base 
    belongs_to :report 
end 

,並呼籲

@chart.report 
@pie.report 
@line.report 
@bar.report 
+0

事情是在您的示例中的@chart對象實際上是一個餅圖的實例化,它是Chart的子級。 – Rabbott 2010-06-15 14:36:46

+0

我用'@ chart'作爲'Chart'的一個實例。 – 2010-06-15 14:40:36

+0

沒錯,這對我來說工作得很好。當我嘗試使用Gender或Sex時,它就成爲一個問題。由於某些原因,使用STI的目的似乎是「Class」類型 – Rabbott 2010-06-15 16:37:41

0

chart_type列需要被重新命名爲剛type,除非你明確地改寫Base.inheritance_column

您是否明確將單表繼承列重命名爲chart_type

+0

我在我的圖表模型中有以下「set_inheritance_column:chart_type」 – Rabbott 2010-06-30 21:35:08

+0

這也會覆蓋它。人力資源管理... – nfm 2010-06-30 21:44:21