【发布时间】:2014-08-24 05:01:15
【问题描述】:
在我的 Rails 应用程序中,我正在实现一个类似于调查的表单,它允许用户填写一组动态变化的问题的答案。目前,我计划支持三种不同“类型”的问题:是/否、评级(1-5 级)和文本。对于这些问题类型中的每一个,我需要相应答案模型的行为略有不同(以适应不同的方法、验证要求等)。我目前正在尝试使用单表继承来实现这些不同的行为,如下所示:
class Question < ActiveRecord::Base
validates_presence_of :question_type
# ...
end
class Answer < ActiveRecord::Base
belongs_to :question
validates_presence_of :answer
# ...
end
class YesNoAnswer < Answer
validates :answer, inclusion: {in: %w(Yes No N/A)}
# ...
end
class RatingAnswer < Answer
validates :answer, numericality: { only_integer: true }, inclusion: {in: 1..5}
def answer
self[:answer].to_i
end
# ...
end
class TextAnswer < Answer
validates :answer, length: { minimum: 2 }
# ...
end
问题在于,对于单表继承,选择的类通常由数据库中每条记录的字段确定。 (默认情况下,此字段为"type",但您可以通过设置inheritance_column 来更改此字段)。
但在我的例子中,答案的类型应该始终与其对应问题的类型相匹配,这样就需要管理一个额外的数据库字段,这样既尴尬又多余。因此,我不想严格依赖数据库中的内容,而是想以编程方式确定给定记录应该使用哪个类。例如:
class Answer < ActiveRecord::Base
# I want a value on the associated question to determine this record's type.
# Simply defining a type method as shown here doesn't work though.
def type
question.try(:question_type)
end
end
这可能吗?如果有,怎么做?
【问题讨论】:
标签: ruby-on-rails single-table-inheritance