我目前正在学习rails并正在尝试创建一个Survey管理应用程序。该应用程序具有以下模型:
class Survey < ApplicationRecord
has_many :survey_questions
has_many :questions, through: : survey_questions
accepts_nested_attributes_for :questions
end
class SurveyQuestion < ApplicationRecord
belongs_to :survey
belongs_to :question
end
class Question < ApplicationRecord
has_many :survey_questions
has_many :surveys, through: :survey_questions
end
我希望能够自动关联现有的问题ID,而不是每次创建新的调查时都会创建一个全新的问题列表。
我发现这个解决方案接近我想要的accepts_nested_attributes_for with find_or_create?。它能够正确地关联我的记录,但是在事务结束时它总是会在Question模型中创建一条新记录。
任何人都可以建议为什么会发生这种情况并帮助我指出正确的方向?谢谢!
修改
以下是我的create
,new
和survey_params
方法的代码:
def new
@survey = Survey.new
@questions = Question.all
unless @question.blank?
@questions.each do |question|
@survey.questions.build(name: question)
end
end
end
def create
@survey = Survey.new(survey_params)
@survey.save!
end
def survey_params
params.require(:survey).permit(:enddate, questions_params: [:name])
end
以下是我对new
和questions_fields
的看法,我正在使用cocoon gem来帮助我动态生成它们:
新
= simple_form_for @survey, url: survey_index_path, method: :post do |f|
= f.input :finaldate, as: :string
= f.simple_fields_for :questions do |qn|
= render 'question_fields', f: qn
= link_to_add_association 'New Question', f, :questions
的question_fields
= f.input :name
= link_to_remove_association 'Remove Question', f