2012-10-04 39 views
1

我在Rails 3中使用mongoid,我碰到這個問題來了:如何在Mongoid中覆蓋繼承模型中的embeds_many?

比方說,我有一個形狀模型:

class Shape 
    include Mongoid::Document 
    field :x, type: Integer 
    field :y, type: Integer 
    embedded_in :canvas 
end 

而且畫布模型(有很多形狀):

class Canvas 
    include Mongoid::Document 
    field :name, type: String 
    embeds_many :shapes 
end 

然後Canvas模型「有許多形狀」。

我從畫布繼承瀏覽器型號:

class Browser < Canvas 
    field :version, type: Integer 
end 

然後Browswer模型應該「有許多形狀」了。

不過,現在我已經從外形繼承了一個「圈」模式:

class Circle < Shape 
    field :radius, type: Float 
end 

而且我想讓瀏覽器模式「有很多圈」,而不是「有許多形狀」。也就是說,我想將Browser模型中的「有許多」關係從「有許多形狀」改寫爲「有許多圓形」。

我應該怎麼做?

回答

0

我不是100%確定的,但我想你只需將embeds_many :circles的行添加到瀏覽器模型。您不需要刪除繼承關係。

由於Circle從Shape繼承,圓形將存儲在存儲在瀏覽器文檔的「shapes」鍵中的數組中,無論如何它們的_type屬性將設置爲「Circle」。換句話說,擁有embeds_many :shapes關係不會在數據庫中創建任何嵌入多個圈子的東西。

但是,這意味着您可以使用諸如Browser.frist.shapes等方法,但您可以簡單地忽略這些方法。添加embeds_many :circles將爲您提供該關係的方法,例如Browser.first.circles

+0

感謝您的澄清。我擔心如果Canvas有一個方法來計算Shape,那麼Browser將能夠使用該方法來計算Circle(假設Browser沒有其他類型的Shape)。也許最好的探索方法是編寫代碼:) – lakeskysea