的ActiveRecord :: AssociationTypeMismatch

时间:2013-05-07 16:55:35

标签: ruby-on-rails

我在Rails应用程序中遇到了AssociationTypeMismatch错误(使用Question.rb和Answer.rb模型):

 ActiveRecord::AssociationTypeMismatch in Questions#show 

 Answer(#70290060797880) expected, got Answer(#70290085447060)

之前我遇到过这个错误,在查看了关于该主题的SO回答之后,能够通过在控制器操作结束时添加“重新加载”来解决问题,该操作以“where”而不是“find”查询”。这就是我在问题展示行动中所做的事情

  @answers = @question.answers
  @answers.each do |a|


       @lawyervotes = AnswerVote.where({:answer_id => a.id, :lawyervote => true}).reload
       @studentvotes = AnswerVote.where({:answer_id => a.id, :studentvote => true}).reload
       @uservotes = AnswerVote.where({:answer_id => a.id, :lawyervote => nil, :studentvote => nil}).reload

    end 

然而,问题再次出现两次(在相同的控制器操作中,但情况略有不同)。在这两种新案例中,服务器日志似乎都表明can_vote_for?在错误发生时调用用户模型的操作。我的代码使用视图

中的代码检查访问者是否有资格使用此代码投票
<% if current_user && current_user.can_vote_for?(answer) %>

调用这个can_vote_for?用户模型中的操作

  def can_vote_for?(answer)
    answer_votes.build(value: 1, answer: answer).valid?
  end

问题:我可以对can_vote_for做些什么吗?方法类似于在控制器的show动作中完成的reload。如果没有,你能否建议我可以做些什么来解决这个问题。

Update

can_vote_for的验证? answer包含在AnswerVote类中,该类属于Answer.rb模型。我认为AssociationTypeMismatch问题可能是'answer'是AnswerVote上的一个属性,也是belongs_to Answer.rb(因此AnswerVote因此将方法'回答'两次,一次通过属性一次通过关联),这可能会造成一些混乱。一旦我启动并停止服务器(并删除并重新提供:answer属性),AssociationTypeMismatch问题就消失了,但我怀疑它可能会再次出现,因为我没有真正解决任何问题。这个问题的另一个问题是:答案实际上不是AnswerVote表上的一列;我得到了该模型的质量分配错误,所以我只是将它添加到attr_accessible列表中,错误消失了,但现在它似乎导致了这个新问题。

class AnswerVote < ActiveRecord::Base
  attr_accessible :answer_id, :user_id, :value, :answer, :lawyervote, :studentvote

  belongs_to :answer
  belongs_to :user

  validates_uniqueness_of :answer_id, scope: :user_id
  validates_inclusion_of :value, in: [1,-1,10,-10, 3]
  validate :ensure_not_author

  def ensure_not_author
    errors.add :user_id, "is the author of the haiku" if answer.user_id == user_id
  end

end

0 个答案:

没有答案