Ruby on rails Rails中具有共享接口的多个模型

Ruby on rails Rails中具有共享接口的多个模型,ruby-on-rails,models,modeling,Ruby On Rails,Models,Modeling,我不确定Rails中针对特定情况的最佳结构。我们有几种类型的车间。无论车间类型如何,车间的管理都是相同的,因此车间的数据在单个模型中。我们收集参与者对研讨会的反馈,每种类型的研讨会的问卷都不同。我想从车间模型中获取有关车间的反馈,但关联模型的类别将取决于车间的类型。如果我在Rails以外的其他地方做这件事,我会为WorkshopFeedback建立一个抽象类,然后为每种类型的研讨会创建子类:WorkshopFeedbackOne、WorkshopFeedback二、WorkshopFeedbac

我不确定Rails中针对特定情况的最佳结构。我们有几种类型的车间。无论车间类型如何,车间的管理都是相同的,因此车间的数据在单个模型中。我们收集参与者对研讨会的反馈,每种类型的研讨会的问卷都不同。我想从车间模型中获取有关车间的反馈,但关联模型的类别将取决于车间的类型。如果我在Rails以外的其他地方做这件事,我会为WorkshopFeedback建立一个抽象类,然后为每种类型的研讨会创建子类:WorkshopFeedbackOne、WorkshopFeedback二、WorkshopFeedback三。我不确定如何用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\u one

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


注意:我在这里避免使用单表继承,因为FeedbackOne、FeedbackTwo、FeedbackThree模型不共享太多公共数据,所以我最终会得到一个包含STI的大型稀疏表

您可以对模型进行子分类,如下所示:

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
课堂研讨会

这可能是一个更好的解决方案,而且更干净。您的
反馈
表需要有一个
类型
列,用于将一个表用于多个类。对的概念进行了很好的基本介绍。

您可以对模型进行子类化,如下所示:

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
课堂研讨会

这可能是一个更好的解决方案,而且更干净。您的
反馈
表需要有一个
类型
列,用于将一个表用于多个类。我认为最好的解决方案是创建一个抽象类研讨会,以及3个子类Workshop1、Workshop2和Workshop3

因此,每个都将有一组反馈,反馈1到工作区1,反馈2到工作区2

您可以按如下方式更改子类中的声明:

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

class Feedback1 < ActiveRecord::Base
  belongs_to :workshop, :class_name => "Workshop1"
end
班级车间1<车间
有很多:反馈,:class\u name=>“反馈1”
结束
类反馈1“车间1”
结束
并且在您的应用程序中,可以使用workshop.feedbacks和feedbacks.workshop,无论workshop或feedback的实例属于哪个类


编辑:您有三种类型的研讨会,信息相同,但每个研讨会都有特定类型的反馈。因此,最好将STI用于研讨会,而不是反馈。

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

因此,每个都将有一组反馈,反馈1到工作区1,反馈2到工作区2

您可以按如下方式更改子类中的声明:

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

class Feedback1 < ActiveRecord::Base
  belongs_to :workshop, :class_name => "Workshop1"
end
班级车间1<车间
有很多:反馈,:class\u name=>“反馈1”
结束
类反馈1“车间1”
结束
并且在您的应用程序中,可以使用workshop.feedbacks和feedbacks.workshop,无论workshop或feedback的实例属于哪个类


编辑:您有三种类型的研讨会,信息相同,但每个研讨会都有特定类型的反馈。因此,最好将STI用于研讨会,而不是反馈。

我应该在我的原始帖子中指出,我不想使用STI,因为不同的反馈并不共享许多领域,我应该在我的原始帖子中注意到,我不想使用STI,因为不同的反馈不会共享很多字段,所以我最终会得到一个填充稀疏的大表。