我在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