如何使用STI创建与现有模型相关的新模型?

时间:2016-02-22 15:55:59

标签: ruby-on-rails ruby-on-rails-4 activerecord sti

如果我有以下使用STI的型号:

# Organization Model
class Organization < ActiveRecord::Base
  has_many :questions
  has_many :answers, :through => :questions
end

# Base Question Model
class Question < ActiveRecord::Base
  belongs_to :organization
  has_many :answers
end

# Subclass of Question
class TextQuestion < Question

end

# Subclass of Question
class CheckboxQuestion < Question

end

构建特定类型的Question 的新对象的正确方法是什么?Organization?或者换句话说,如果我有一个组织,并且我希望该组织拥有新的CheckboxQuestion,我可以使用常规构建器方法吗?

例如,我希望能够做到:

org = Organization.last
org.text_questions.build(:question_text => "What is your name?")

...但这会给我一个NoMethodError: undefined method text_questions错误。

2 个答案:

答案 0 :(得分:3)

Organization模型不知道从Question继承的类,因此您可以通过这种方式启动/创建问题实例。要启动/创建特定类型的问题,您必须自己明确设置。例如:

organization = Organization.where(...).last
organization.questions.build(question_text: 'text', type: 'TextQuestion')

您可以在has_many *_questions类中定义多个Organization,但感觉这是一个糟糕的设计,如果您最终拥有大量Question子类,事情就会失控你的申请。

答案 1 :(得分:2)

在没有看到Organization模型的情况下,不是100%肯定,但这可能是您正在寻找的:

class Organization < ActiveRecord::Base
  has_many :test_questions
  has_many :checkbox_questions
end

希望有所帮助:)