Rails STI没有保存"类型"领域

时间:2014-05-26 20:13:26

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord single-table-inheritance

我正在尝试为Questions表设置单个表继承。我已经按照一些建议添加了一条路线:

  

资源:vfquestions,:controller => 'questions',:type =>   'Vfquestion'

模特:

class Vfquestion < Question
end

可行,将问题保存在数据库中,但type字段保持为空。

这是我的控制器:

class QuestionsController < ApplicationController
  before_action :authenticate_user!

  def index
    @user = current_user
    @category = Category.find(params[:category_id])
    @questions = @user.questions.where(:type => params[:type])
  end

  def new
    @category = Category.find(params[:category_id])
    @question = @category.questions.new
    @question.type = params[:type]
  end

  def show
    @user = current_user
    @category = @user.categories.find(params[:category_id])
    @question = @category.questions.find(params[:id])
  end

  def create
    @user = current_user
    @category = Category.find(params[:category_id])
    @question = @category.questions.new(question_params)
    @question.user_id = current_user.id
    @question.save
  end

  private
    def question_params
      params.require(:question).permit(:title, :body)
    end

end

我错过了保存这个参数的东西吗?

2 个答案:

答案 0 :(得分:2)

据我所知,type未保存为基类。它也不能通过参数覆盖,因为这意味着X.new可能会产生X以外的类的实例。

您需要做的是在路上创建正确的类型:

@question =
  case (params[:question][:type])
  when 'Vfquestion'
    Vfquestion.new(params[:question])
  else
    Question.new(params[:question])
  end

@category.questions << @question

关系也是根据单数基类定义的,因此在该范围内构建的所有对象都将默认为基类。

答案 1 :(得分:0)

我猜你的Category模型中有一条线:

has_many :questions

问题是这种关系指向父Question模型;它不知道你想创建或找到它的任何子类型(请记住,Rails按约定优于配置操作;在这种情况下,rails因为命名Question关系的惯例而定位您的has_many模型)。

解决此问题的一种方法是添加适当的子类型,如下所示:

has_many :vfquestions
has_many :some_other_question_subtype

然后为特定类别创建新的VFQuestion,您只需:

@question = @category.vfquestions.new(question_params)

旁注

您的情况中的部分问题是,在您的create方法中,当您创建它时,您无法区分VFquestion或其他一些问题子类型。您必须找出为您的特定域处理此问题的最佳方法,但可能最简单的方法是从表单传递type参数。因此,例如,如果您在不同的问题类型之间有某种类型的单选按钮,请确保它被正确命名,以便在提交表单时发送。然后只需检查参数中的那一段数据,然后调用.vfquestions或其他一些问题子类型。