首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有共享接口的Rails中的多个模型

具有共享接口的Rails中的多个模型
EN

Stack Overflow用户
提问于 2010-03-20 03:02:05
回答 2查看 2.1K关注 0票数 1

对于Rails中的特定情况,我不确定最好的结构。我们有几种类型的研讨会。不管研讨会的类型如何,研讨会的管理都是相同的,因此研讨会的数据是在单个模型中。我们从参与者那里收集关于研讨会的反馈,每种类型的研讨会的调查问卷都是不同的。我想从研讨会模型中访问有关研讨会的反馈,但关联模型的类将取决于研讨会的类型。如果我使用的不是Rails,我会为WorkshopFeedback设置一个抽象类,然后为每种类型的工作室创建子类: WorkshopFeedbackOne、WorkshopFeedbackTwo、WorkshopFeedbackThree。我不确定如何最好地使用Rails来处理这个问题。

我目前有:

代码语言:javascript
运行
复制
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的大型稀疏填充的表。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-20 04:10:51

我认为最好的解决方案是创建一个抽象类研讨会,并创建3个子类Workshop1、Workshop2和Workshop3。

因此,每个都有自己的反馈集,Feedback1到Workshop1,Feedback2到Workshop2,...

您可以更改子类中的声明,如下所示:

代码语言:javascript
运行
复制
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用于研讨会,而不是用于反馈。

票数 1
EN

Stack Overflow用户

发布于 2010-03-20 03:14:47

您可以将模型子类化,如下所示:

代码语言:javascript
运行
复制
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的概念。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2479906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档