0

User回答とレッスンのリストを保存できるクラスがあります

  has_many :answers
  has_many :lessons, :through => :answers

回答クラス:

class Answer < ActiveRecord::Base
    belongs_to :user
    belongs_to :lesson

    attr_accessible :finished, :current_solution
end

ユーザーがレッスンに取り組むたびに、彼の最新の回答を保存したいと思います。私はこのようにそれをやろうとしました:

if current_user
  @lesson = Lesson.find(params[:id])
  @code = request.request_parameters["code"]
  @user = User.find(session[:user_id])
  begin     # retrieve an old answer, if possible
    @answer = Answer.find [params[:id], session[:user_id]]
  rescue
  end
  if not @answer  # else create a new one
    @answer = Answer.new
    @answer.lesson_id = @lesson.id
    @answer.user_id = @user.id
    @user.answers << @answer  # store it in the user's answers list
  end

  @validation_passed = @lesson.validate( @code ) 
  @answer.finished = @validation_passed # update answer
  @answer.current_solution = @code

データベーススキーマ:

  create_table "answers", :id => false, :force => true do |t|
    t.integer "lesson_id",        :null => false
    t.integer "user_id",          :null => false
    t.string  "finished"
    t.string  "current_solution"
  end

  add_index "answers", ["lesson_id", "user_id"], :name => "index_answers_on_lesson_id_and_user_id", :unique => true

例外columns lesson_id, user_id are not unique、またはcolumns lesson_id, user_id are not unique: INSERT INTO "answers" ("current_solution", "finished", "lesson_id", "user_id") VALUES (?, ?, ?, ?)が発生しますが、対応する座標でオブジェクトが見つからない場合にのみ新しいオブジェクトを作成するため、なぜそれが発生するのかわかりません。

誰かが私が間違ったことを教えてくれたら嬉しいです。

前もって感謝します!:)

4

1 に答える 1

2

fromパラメータを見つけるためのクエリAnswerは正しくありません-次のようになります:

@answer = Answer.find_by_lesson_id_and_user_id(@lesson.id, @user.id)

この方法で行う場合は、---ブロックをbeginスキップすることもできます。rescueend

また、関連付けを検索すると、これをさらに単純化できます。

@answer = @user.answers.where(:lesson_id => @lesson).first

Answerさらに、これが一般的なルックアップである場合は、クラスにスコープを追加できます。

class Answer < ActiveRecord::Base
  scope :for_lesson, lambda{ |lesson| where(:lesson_id => lesson) }
end

そして、これを次のように単純化できます。

@answer = @user.answers.for_lesson(@lesson).first
于 2013-01-24T22:36:03.960 に答える