1

クイズに答えるユーザーがいます。私は彼らが選んだ結果を追跡します。彼らがクイズの提出を変更できるようにする方法を理解する必要があります。答えを関連付けただけだと、彼らは質問に 2 回答えたことになります。データの構築は複雑ですが、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

3 つの質問といくつかの答えを考えてみましょう。

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?">]

ジムは考えを変え、スーパートルーパーズが好きで投票したくないと決心しましたが、それでも黒人は好きです。彼に何度も質問に答えてもらうことなくこれを更新するにはどうすればよいですか?

# 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',
  }
}
4

1 に答える 1

0

まず、データの形式を変更して、結果が名前形式ではなくID形式になるようにします。

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を直接設定すると、ActiveRecordがすべての複雑さを処理します。

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>]
于 2012-08-30T17:39:49.707 に答える