我有一个应用程序,人们可以在其中进行测验。测验可以有许多问题,可以是不同类型的(“对或错”,在一组提供的答案中进行选择等)。
我发现最好的实现方式是有一个Question
模型(和questions
表),然后我将它的数据保存在不同的表中,这取决于它是什么类型的问题。例如,如果它是一个“真或假”问题,那么它会将其数据保存在
create_table :boolean_question_data do |t|
t.boolean :answer
end
例如,如果它是一个“图像”问题,那么它会将其数据保存在
create_table :image_question_data do |t|
t.attachment :image
t.string :image
end
等等。
所以,我想实现这个的一种方法(我愿意接受建议:))是questions
表有列#id
和#category
,“数据”表(boolean_question_data
, image_question_data
)有一个#question_id
列(没有主键),我也有这在我的Question
模型中:
has_one :data, polymorphic: true
我之所以要这样做,是因为我希望问题具有唯一的主键,而不管类别如何。所以,我想要正常的 URL,比如/questions/3
,Question
模型只会搜索#id
3 的,然后看到它#category
是“布尔值”,然后它知道它必须在boolean_question_data
表中搜索它的数据。
我不能使用多态belongs_to
(而不是has_one
)的原因是因为它不适合这种用法。它没有为我提供#build_data
等#create_data
,而是希望我以相反的方式编写代码,即从“数据”模型中引用问题。这显然不是我想做的事情。
我会自己编写该关联,但我也想使用很多选项 ( autosave: true, validate: true, dependent: :destroy
),因此手动编写所有这些有点过头了。
你对我有什么建议吗?