2010-06-16 79 views
2

我在Rails中實現了單個表繼承。以下是相應的遷移:在Ruby on Rails中繼承:設置基類的類型

class CreateA < ActiveRecord::Migration 
    def self.up 
    create_table :a do |t| 
     t.string :type 
    end 
end 

B類從A繼承:

class B < A 
end 

現在,很容易獲得B類的所有實例:

B.find(:all) 

A.find_all_by_type("B") 

但是我如何找到類的所有實例A(那些不是B型的)?這是不好的組織嗎?

我嘗試這樣做:

A.find_all_by_type("A") 

但A類的實例有一個nil類型。我能做

A.find_all_by_type(nil) 

但這不覺得正確,不知何故。特別是,如果我決定從另一個類繼承A,它將停止工作。

在遷移中爲type定義默認值會更合適嗎?類似於:

t.string :type, :default => "A" 

我在這裏做錯了什麼嗎?

回答

2

類型字段更多的是子類型,這就是爲什麼祖先類沒有類型的原因。

實際上,您可以將A類記錄的類型設置爲'A',並且它仍然可以正常運行,並具有溫暖的模糊感。 :)

class A 
    before_create :set_default_type 

    def set_default_type 
    self.type = self.class.name if type.blank? 
    end 
end 
+0

你會怎麼做?通過手動爲每個新的A實例設置它,還是通過定義默認的類型值? – 2010-06-17 12:53:30

+0

添加示例^^ – 2010-06-17 15:39:29

+0

即使我意識到我可能沒有使用正確的數據模型,但我喜歡這樣。 – 2010-06-19 09:30:47