对于Rails中的特定情况,我不确定最好的结构。我们有几种类型的研讨会。不管研讨会的类型如何,研讨会的管理都是相同的,因此研讨会的数据是在单个模型中。我们从参与者那里收集关于研讨会的反馈,每种类型的研讨会的调查问卷都是不同的。我想从研讨会模型中访问有关研讨会的反馈,但关联模型的类将取决于研讨会的类型。如果我使用的不是Rails,我会为WorkshopFeedback设置一个抽象类,然后为每种类型的工作室创建子类: WorkshopFeedbackOne、WorkshopFeedbackTwo、WorkshopFeedbackThree。我不确定如何最好地使用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。
有没有更好的方法来处理这种情况?使用多态关联进行反馈会不会更好?或者可能使用Module或Mixin作为共享反馈接口?
注意:我在这里避免使用单表继承,因为FeedbackOne、FeedbackTwo、FeedbackThree模型不共享太多公共数据,所以我最终会得到一个带有STI的大型稀疏填充的表。
发布于 2010-03-20 04:10:51
我认为最好的解决方案是创建一个抽象类研讨会,并创建3个子类Workshop1、Workshop2和Workshop3。
因此,每个都有自己的反馈集,Feedback1到Workshop1,Feedback2到Workshop2,...
您可以更改子类中的声明,如下所示:
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用于研讨会,而不是用于反馈。
发布于 2010-03-20 03:14:47
您可以将模型子类化,如下所示:
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 post很好地介绍了Single Table Inheritance的概念。
https://stackoverflow.com/questions/2479906
复制相似问题