Rails 3控制器 - 如果问题记录没有相应的答案记录,请创建一个

时间:2011-05-08 20:23:39

标签: ruby-on-rails-3

我已经使用过rails 2 ......但我仍然是铁路3 noob /灾难。

@questions是问题表中的一组问题。我需要确保每个问题在答案表中都有相应的答案记录。如果不存在,我需要创建一个默认值为零的。在我的控制器中,我有以下内容:

# create records for answers that do not exist yet
@questions.each do |q|
  a = Answer.where(q.id = Answer.question_id and current_user.id = Answer.user_id )
  if a.nil?
    Answer.new(:question_id => q.id, :score => 0)
  end
end

我收到此错误:

undefined method `question_id'

我正在度假并使用Rails进行第四版Agile Web Development(不要告诉我的妻子:=])这里提供的任何帮助都会有所帮助。

感谢。

3 个答案:

答案 0 :(得分:2)

您的代码应如下所示

@questions.each do |q|
  a = Answer.where(:question_id => q.id, :user_id => current_user.id)
  if a.empty?
    Answer.new(:question_id => q.id, :score => 0)
  end
end

但它可以重构为

@questions.each do |q|
  q.answers.create(:score => 0) unless q.answers.where(:user => current_user).any?
end

修改

至于你不明白这里发生了什么:你应该或createsave你的对象:

answer = Answer.new(:question_id => q.id, :score => 0)
answer.save

Answer.create(:question_id => q.id, :score => 0)

答案 1 :(得分:1)

activerecord查询语法不正确。它应该是这样的 -

@questions.each do |q|
  a = Answer.where("question_id = ? AND user_id = ?", q.id, current_user.id )
  if a.nil?
    Answer.new(:question_id => q.id, :score => 0)
  end
end

请查看此帖子了解更多详情http://m.onkey.org/active-record-query-interface

答案 2 :(得分:0)

假设您已向has_many添加Question关系,则可以执行此操作

@questions.each do |q|
  if q.answers.empty?
    q.answers.create! :score => 0, :user => current_user
  end
end

它迭代问题,检查问题是否有答案,并添加一个得分为零的用户current_user,如果它是空的。如果保存失败也会引发错误(这是!添加createsave的错误。

您必须确保您的模型了解此工作的关系:

class Question < ActiveRecord::Base
  has_many :answers
end

class Answer < ActiveRecord::Base
  belongs_to :question
  belongs_to :user
end