在许多模型中使用的创建模型上添加记录

时间:2013-11-27 05:32:57

标签: ruby-on-rails model callback

我有一项调查,我希望每当用户第一次回答问题时,都会将参与者添加到Participant模型中。该调查有点特殊,因为它有许多功能可以回答标记词,多项选择和开放式问题等问题,每个函数实际上都是一个有自己记录的模型。此外,我只想让参与者保存一次。

参与者模型非常简单:

class Participant < ActiveRecord::Base
  belongs_to :survey
  attr_accessible :survey_id, :user_id
end

调查模型也很简单:

class Survey < ActiveRecord::Base
  ...
  has_many :participants, :through => :users
  has_many :rating_questions, :dependent => :destroy
  has_many :open_questions, :dependent => :destroy
  has_many :tag_questions, :dependent => :destroy
  belongs_to :account
  belongs_to :user

  accepts_nested_attributes_for :open_questions
  accepts_nested_attributes_for :rating_questions
  accepts_nested_attributes_for :tag_questions
  ...
end

然后,您拥有rating_answers等属于rating_questionopen_answers属于open_questions的模型,依此类推。

所以最初我想在我的模型中rating_answers我可以将after_create回调添加到add_participant

像这样:

class RatingAnswer < ActiveRecord::Base
   belongs_to :rating_question
   after_create :add_participant
   ...
   protected
   def add_participant
     @participant = Participant.where(:user_id => current_user.id, :survey_id => Survey.find(params[:survey_id]))
     if @participant.nil?
       Participant.create!(:user_id => current_user.id, :survey_id => Survey.find(params[:survey_id]))
     end
   end
end

在这种情况下,我不知道如何找到survey_id,所以我尝试使用params,但我不认为这是正确的方法。它返回了这个错误

NameError (undefined local variable or method `current_user' for #<RatingAnswer:0x0000010325ef00>):
  app/models/rating_answer.rb:25:in `add_participant'
  app/controllers/rating_answers_controller.rb:12:in `create'

我的另一个想法是创建一个我可以在每个控制器中使用的模块Participants.rb

module Participants
  def add_participant
    @participant = Participant.where(:user_id => current_user.id, :survey_id => Survey.find(params[:survey_id]))
    if @participant.nil?
      Participant.create!(:user_id => current_user.id, :survey_id => Survey.find(params[:survey_id]))
    end
  end
end

并在控制器中

class RatingAnswersController < ApplicationController
  include Participants
  def create
    @rating_question = RatingQuestion.find_by_id(params[:rating_question_id])
    @rating_answer = RatingAnswer.new(params[:rating_answer])
    @survey = Survey.find(params[:survey_id])
    if @rating_answer.save
      add_participant
      respond_to do |format|
        format.js
      end
    end
  end
end

我收到了路由错误

ActionController::RoutingError (uninitialized constant RatingAnswersController::Participants):

我可以理解这个错误,因为我没有带有create方法及其路由资源的参与者的控制器

我不确定从嵌套模型向模型添加记录的正确方法是什么,以及什么是更清洁的方法。

非常欢迎您的想法!

2 个答案:

答案 0 :(得分:1)

current_user是一个只能在视图/控制器中访问的帮助程序。您需要将其作为参数传递到模型中。否则,模型中无法访问它。可能是,这应该有所帮助。

答案 1 :(得分:0)

最后我最终使用了after_create回调,但是我没有从参数中获取数据,而是使用了关联。 if @participant.nil?也因某种原因无效。

class RatingAnswer < ActiveRecord::Base
   belongs_to :rating_question
   after_create :add_participant
   ...
   protected
   def add_participant
    @participant = Participant.where(:user_id => self.user.id, :survey_id => self.rating_question.survey.id)
    unless @participant.any?
      @new_participant = Participant.create(:user_id => self.user.id, :survey_id => self.survey.rating_question.id)
    end
  end
end

关联的很酷的事情是,如果你有深层嵌套的关联,而不是

Survey has_many questions
Question has_many answers
Answer has_many responses

为了从响应模型中获取调查ID,您可以

self.answer.question.survey.id
非常漂亮!