2012-08-29 3 views
1

일부 사용자는 퀴즈를 탔습니다. 그들이 선택한 결과를 추적합니다. 나는 그들이 퀴즈 제출을 변경하는 방법을 알아 내야합니다. 방금 답변을 연결하면 질문에 두 번 대답하게됩니다. 데이터 구축은 복잡합니다. ActiveRecord는이를 처리 할 방법을 제공합니까?레일에서 중첩 된 데이터를 업데이트하는 방법

이 전체 예제는 독립 실행 형 파일에서 실행됩니다. 여기

require 'active_record' 

ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:' 

ActiveRecord::Schema.define do 
    self.verbose = false 

    create_table :users do |t| 
    t.string :name 
    end 

    create_table :questions do |t| 
    t.string :name 
    end 

    create_table :question_results do |t| 
    t.string :name 
    t.integer :question_id 
    end 

    create_table :question_results_users do |t| 
    t.integer :user_id 
    t.integer :question_result_id 
    end 
end 

내 모델입니다 :

class User < ActiveRecord::Base 
    has_and_belongs_to_many :question_results 
    has_many :questions, through: :question_results 
end 

class Question < ActiveRecord::Base 
    has_many :question_results 
end 

class QuestionResult < ActiveRecord::Base 
    belongs_to :question 
    has_and_belongs_to_many :users 
end 

이 세 가지 질문을 할 수 있습니다 어떤 답변 :

Question.create! name: "What's your favourite movie?" do |question| 
    question.question_results.build name: 'Gattaca' 
    question.question_results.build name: 'Super Troopers' 
end 

Question.create! name: 'Who do you want to be president?' do |question| 
    question.question_results.build name: 'Barack Obama' 
    question.question_results.build name: 'Mitt Romney' 
    question.question_results.build name: 'Mickey Mouse' 
end 

Question.create! name: "What's your favourite colour?" do |question| 
    question.question_results.build name: 'black' 
    question.question_results.build name: 'green' 
end 

사용자를 만들 수 있습니다 :

여기

내 스키마입니다
jim = User.create! name: 'Jim' 
jim.question_results << QuestionResult.find_by_name('Gattaca') 
jim.question_results << QuestionResult.find_by_name('Barack Obama') 
jim.question_results << QuestionResult.find_by_name('black') 

jim.question_results     # => [#<QuestionResult id: 1, name: "Gattaca", question_id: 1>, #<QuestionResult id: 3, name: "Barack Obama", question_id: 2>, #<QuestionResult id: 6, name: "black", question_id: 3>] 
jim.question_results.map(&:question) # => [#<Question id: 1, name: "What's your favourite movie?">, #<Question id: 2, name: "Who do you want to be president?">, #<Question id: 3, name: "What's your favourite colour?">] 

짐 (Jim)은 마음이 바뀌고, 그는 슈퍼 트루퍼 (Super Troopers)를 좋아하고 투표하기를 원하지 않는다고 결정하지만 그는 여전히 검은 색을 좋아합니다. 질문에 여러 번 대답하지 않고 어떻게 업데이트합니까?

# pretend we're in a controller here (also note that I can change the format of the data, if there is something more convenient) 
posted_from_form = { 
    questions: { 
    Question.all[0].id => 'Super Troopers', 
    Question.all[1].id => '', 
    Question.all[2].id => 'black', 
    } 
} 

답변

0
먼저 결과가 이름 대신 양식의 아이디 형태로되도록 우리의 데이터의 형식을 변경할 수 있습니다

:

posted_from_form = { 
    questions: { 
    Question.all[0].id => QuestionResult.find_by_name('Super Troopers').id.to_s, 
    Question.all[1].id => '', 
    Question.all[2].id => QuestionResult.find_by_name('black').id, 
    } 
} 

그런 다음 직접 ID를 설정할 수 있으며 액티브는 모든 처리합니다 복잡성 :

jim.question_result_ids = posted_from_form[:questions].values # => ["2", "", 6] 
jim.question_results # => [#<QuestionResult id: 6, name: "black", question_id: 3>, #<QuestionResult id: 2, name: "Super Troopers", question_id: 1>] 
관련 문제