2010-03-19 35 views
1

我不确定Rails中特定情况的最佳结构。我们有几种类型的研讨会。无论研讨会类型如何,研讨会的管理都是相同的,因此研讨会的数据采用单一模式。我们收集参与者关于研讨会的反馈,并且每种类型的研讨会的调查问卷都有所不同。我想从车间模型中获取有关车间的反馈,但相关车型的类别取决于车间的类型。如果我是通过Rails之外的其他方法来完成这项工作,我将为WorkshopFeedback设置一个抽象类,然后为每个类型的工作室分配一个子类:WorkshopFeedbackOne,WorkshopFeedbackTwo,WorkshopFeedbackThree。我不确定如何最好地处理这与Rails。带有共享接口的Rails中的多个模型

我目前有:

class Workshop < ActiveRecord::Base 
    has_many :workshop_feedbacks 
end 

class Feedback < ActiveRecord::Base 
    belongs_to :workshop 
    has_many :feedback_ones 
    has_many :feedback_twos 
    has_many :feedback_threes 
end 

class FeedbackOne < ActiveRecord::Base 
    belongs_to :feedback 
end 

class FeedbackTwo < ActiveRecord::Base 
    belongs_to :feedback 
end 

class FeedbackThree < ActiveRecord::Base 
    belongs_to :feedback 
end 

这似乎并不喜欢从车间模型访问反馈,访问正确的反馈,需要逻辑调查研讨会类型,然后选择最清晰的方式,例如@ workshop.feedback.feedback_one。

有没有更好的方法来处理这种情况?使用多态关联进行反馈会更好吗?或者可以使用模块或Mixin作为共享反馈接口?

注意:我在这里避免使用Single Table Inheritance,因为FeedbackOne,FeedbackTwo,FeedbackThree模型不会共享太多的常见数据,所以我最终会得到一个STI的大型稀疏填充表。

回答

1

我认为最好的解决方案是创建一个抽象类Workshop,以及3个子类Workshop1,Workshop2和Workshop3。

因此,每次都会有其设定的反馈的,FEEDBACK1到车间1,Feedback2到车间2,...

您可以在子类中改变声明如下:

class Workshop1 < Workshop 
    has_many :feedbacks, :class_name => "Feedback1" 
end 

class Feedback1 < ActiveRecord::Base 
    belongs_to :workshop, :class_name => "Workshop1" 
end 

而在你的应用程序可以使用workshop.feedbacks和feedback.workshop,无论研讨会或反馈所属的实例是什么类。

编辑:您有三种类型的研讨会,其中包含共同的信息,但每个研讨会都有特定类型的反馈。因此,使用STI进行Workshop是最好的,而不是反馈。

0

你可以继承你的模型,像这样:

class Workshop < ActiveRecord::Base 
    has_many :feedback_ones 
    has_many :feedback_twos 
    has_many :feedback_threes 
    #has_many :feedbacks # This MIGHT work, but is untested. I'm not at a dev setup to try. 
end 

class Feedback < ActiveRecord::Base 
    belongs_to :workshop 
    has_many :feedback_ones 
    has_many :feedback_twos 
    has_many :feedback_threes 
end 

class FeedbackOne < Feedback 
    belongs_to :feedback 
end 

class FeedbackTwo < Feedback 
    belongs_to :feedback 
end 

class FeedbackThree < Feedback 
    belongs_to :feedback 
end 

这可能是一个更好的解决方案,并且是清洁。您的Feedback表需要有一个type列,它用于为多个类使用一个表。 This blog postSingle Table Inheritance的概念给出了很好的基本介绍。

+1

我应该在我的原始文章中注意到我不想使用STI,因为不同的反馈不会共享许多字段,所以我最终会得到一个大的人口稀少的表格。 – 2010-03-19 19:23:09