2010-01-14 54 views
2

我有以下單表繼承:層次結構中的所有類都具有相同的屬性?

class Item < ActiveRecord::Base 
end 

class Talk < Item 
end 

與遷移

class CreateItems < ActiveRecord::Migration 
    def self.up 
    create_table :items do |t| 
     t.string :type 
     t.string :name 
     t.text :description 
     t.time :start_time 
     t.time :duration 
     t.timestamps 
    end 
    end 

    ... 
end 

默認情況下,說明房地產將可在項目和談話類。有沒有辦法限制這個屬性,這樣只有Talk類可用?

回答

2
class Item < ActiveRecord::Base 
    def duration 
    raise NoMethodError 
    end 

    def duration=(value) 
    raise NoMethodError 
    end 
end 

class Talk < Item 
    def duration 
    read_attribute(:duration) 
    end 

    def duration=(value) 
    write_attribute(:duration, value) 
    end 
end 

你可以隨時做到這一點,但是這無關緊要。當你閱讀物品的持續時間時會發生什麼最壞的情況?你會回零,這將導致此後不久。你不需要在Ruby中關注這些類型的問題。

如果需要,您可以創建一個模塊,並將模塊包含在兩個類中,用於共享行爲,並刪除STI。

+0

該屬性仍然可以在Item類中使用'read_attribute(:duration)'來讀取......將它放入模塊似乎沒有幫助,因爲ActiveRecord'神奇地'找到屬性,而不是自寫的類。 – Veger 2010-01-14 16:06:26

+0

也許這是我的Java日常工作影響我的一個例子。我的想法是,如果沒有保護財產,另一位開發人員可能會希望該領域在其中的應用,事實上並非如此。例如,他們可能會創建一個引用description字段的視圖。當然,在我目前的鐵路項目中,實際上只有我們兩個,我們顯然已經足夠了,因爲這不會發生。儘管如此,它確實給我留下了一個小小的感覺:) – opsb 2010-01-14 17:30:49

相關問題