2011-01-22 61 views
1

說我們有:如何比多態關聯更好的方式分享軌道3與其他數據庫模型的模型

class ProductProperties < ActiveRecord::Base 
belongs_to :sellable, :polymorphic => true, :dependent => :destroy 
end 

class Tee < ActiveRecord::Base 
has_one :product_properties, :as => :sellable, :autosave => true 
end 

class Pen < ActiveRecord::Base 
has_one :product_properties, :as => :sellable, :autosave => true 
end 

的,我們可以解決產品特性: @ Tee.productProperties.property或@ Pen.productProperties.property

有沒有辦法簡單地訪問@ Tee.property和@ Pen.property?

這將使它更簡單,因爲T恤和Pen每個人都有自己的屬性(例如:@ Pen.ownProperty)

到目前爲止,我的研究使我這個插件: https://github.com/brunofrank/class-table-inheritance。 有沒有人使用過它,並使用它是一個好主意(我的直覺是,這將在每個新的rails版本中打破)?

謝謝!

回答

1

一種解決方法是定義一個方法,讓您直接訪問繼承屬性:

class Pen < ActiveRecord::Base 
    def some_property 
    product_properties.some_property 
    end 
end 

# These calls are equivalent 
@pen.some_property 
@pen.product_properties.some_property 

如果你有很多的屬性,你可能會想動態做到這一點:

class Pen < ActiveRecord::Base 
    [ :property1, :property2, :property3 ].each do |property| 
    define_method(:property) do 
     product_properties.some_property 
    end 
    end 
end 

但是,這聽起來像是Single Table Inheritance的主要候選人。您可以創建您的孩子模型(PenTee等)從其繼承的父模型(Product)。它們具有Product的所有屬性以及它們自己的特定屬性。

看看網上的散步教程。