2010-05-11 82 views
2

请耐心等待,因为我试图准确解释我想实现的目标。接口与否?:动态创建Ruby on Rails中的多态模型关系

在我的Ruby on Rails应用程序中,我有一个名为Page的模型。

它代表一个网页。

我想让用户随意附加组件到页面。 “组件”的一些例子是图片,PictureCollection,视频,VideoCollection,背景,音频,表单,评论。

目前我有这样的页面和图片之间有直接的关系:

class Page < ActiveRecord::Base 
    has_many :pictures, :as => :imageable, :dependent => :destroy 
end 

class Picture < ActiveRecord::Base 
    belongs_to :imageable, :polymorphic => true 
end 

这种关系使用户能够在图片任意数量的页面相关联。现在,如果我想提供多个集合我需要一个额外的模型:

class PictureCollection < ActiveRecord::Base 
    belongs_to :collectionable, :polymorphic => true 
    has_many :pictures, :as => :imageable, :dependent => :destroy 
end 

,改变页面引用新模式:

class Page < ActiveRecord::Base 
    has_many :picture_collections, :as => :collectionable, :dependent => :destroy 
end 

现在,它有可能为用户添加任何数量的图像集合到页面上。

但是,这仍然是非常静态的:在页面模型中的:picture_collections参考。如果我添加另一个“组件”,例如:video_collections,则需要在页面中为该组件类型声明另一个引用。

所以我的问题是这样的:

我是否需要添加对每个组件类型的新基准,或者是有一些其他的方式?在Actionscript/Java中,我将声明一个接口组件并使所有组件实现该接口,然后我可以只有一个属性:包含所有动态关联模型对象的组件。

这是Rails,我相信有一个很好的方法来实现这一点,但它对谷歌来说是一个棘手的方法。也许你的好人有一些明智的建议。提前感谢您花时间阅读并回答此问题。

回答

0

我相信你可以只使用

class Page < ActiveRecord::Base 
    has_many :components, :as => :attachable, :dependent => :destroy 
end 

class Picture < ActiveRecord::Base 
    belongs_to :attachable, :polymorphic => true 
end 

class PictureCollection < ActiveRecord::Base 
    belongs_to :attachable, :polymorphic => true 
    has_many :pictures, :as => :imageable, :dependent => :destroy 
end 

等等...

+0

Ĵ您好,我想这一点,但我不断收到一个 '未初始化的常量页:: Component' 错误当我访问Page.components 你有任何建议如何解决这个问题? 谢谢 – ktec 2010-05-18 17:55:05

+0

我在想...也许你必须定义每个关系......或者定义一个Component类,并使得Picture和PictureCollection从这个类派生。 – 2010-05-18 19:04:44