model属性是活动记录关系的未定义方法

时间:2013-03-01 22:05:16

标签: ruby-on-rails rails-activerecord

我有一个Rails应用程序,其中用户创建一个问题(问题模型接受答案模型的嵌套属性)和至少三个答案选项。 Answer模型的属性是:content(对于问题)和:correctanswer,一个布尔复选框,供用户检查答案选择是否正确。由于它是一个复选框,因此表单允许用户选择多个答案为true。我是这样做的,因为我无法弄清楚如何将一个单选按钮与每个答案选项相关联。

为了强制用户仅将一个答案选项标记为正确,我尝试在Question.rb模型中创建自定义验证,但这是您将看到我可怕的红宝石技能的地方。在下面的代码中,self是问题,答案是嵌套模型,而correctanswer是嵌套模型的属性。我收到一条错误消息

undefined method `correctanswer' for []:ActiveRecord::Relation

你能告诉我如何实现我想做的事吗?我不确定在'if'语句的末尾使用.size != 1(即将计算正确的数量并拒绝它,如果它不是一个吗?),因为首先弹出了正确的错误,我无法看到它是否有效。

validate :only_one_checked_box

  def only_one_checked_box
     if self.answers.correctanswer.reject(&:marked_for_destruction?).size != 1

      self.errors[:base] << "Must mark one and only answer as correct"
    end

  end 

2 个答案:

答案 0 :(得分:2)

我在这里猜测是因为我看不到你的答案模型,但我怀疑你想要做以下事情:

def only_one_checked_box
  if self.answers.select{|a| a.correctanswer == true}.size !=1
    self.errors[:base] << "Must mark one and only answer as correct"
  end
end

答案 1 :(得分:1)

self.answers是一个答案数组,因此您应该迭代并检查答案是否标记为正确。一个简单的方法就是:

def only_one_checked_box
  correct = 0
  self.answers.each { |a| correct += 1 if a.correctanswer }

  if correct != 1
    self.errors[:base] << "Must mark one and only answer as correct"
  end
end