我正在尝试为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
我错过了保存这个参数的东西吗?
答案 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
或其他一些问题子类型。