osem-fcy/db/migrate/20160309182655_remove_dietary_choices_table.rb

173 lines
6.6 KiB
Ruby

class RemoveDietaryChoicesTable < ActiveRecord::Migration
class TempDietaryChoice < ActiveRecord::Base
self.table_name = 'dietary_choices'
belongs_to :temp_conference
end
class TempConference < ActiveRecord::Base
self.table_name = 'conferences'
has_many :temp_dietary_choices, dependent: :destroy
end
class TempRegistration < ActiveRecord::Base
self.table_name = 'registrations'
belongs_to :temp_conference
end
class TempQuestionType < ActiveRecord::Base
self.table_name = 'question_types'
has_many :temp_questions
end
class TempQuestion < ActiveRecord::Base
self.table_name = 'questions'
has_many :temp_qanswers
has_many :temp_answers, through: :temp_qanswers
belongs_to :temp_question_type
has_and_belongs_to_many :temp_conferences
end
class TempAnswer < ActiveRecord::Base
self.table_name = 'answers'
has_many :temp_qanswers
has_many :temp_questions, through: :temp_qanswers
end
class TempQanswer < ActiveRecord::Base
self.table_name = 'qanswers'
belongs_to :temp_question
belongs_to :temp_answer
has_and_belongs_to_many :temp_registrations
end
class TempConferencesQuestions < ActiveRecord::Base
self.table_name = 'conferences_questions'
end
class TempQanswerRegistration < ActiveRecord::Base
self.table_name = 'qanswers_registrations'
end
def up
# Create Question of 'Multiple Choice' type
if TempDietaryChoice.all.any?
qtype = TempQuestionType.find_or_create_by!(title: 'Single Choice')
end
# Migrate dietary_choice_id to a question
TempConference.all.each do |conference|
if TempDietaryChoice.where(conference_id: conference.id).any?
# Find existing question or initialize it
question = TempQuestion.find_or_initialize_by(title: 'Which is your dietary choice?',
conference_id: conference.id,
question_type_id: qtype.id)
question.save!
# Enable the question for the conference
TempConferencesQuestions.find_or_create_by!(conference_id: conference.id,
question_id: question.id)
TempDietaryChoice.where(conference_id: conference.id).each do |dietary_choice|
answer = TempAnswer.find_or_create_by!(title: dietary_choice.title)
# Associate answer with the question
qa = TempQanswer.find_or_initialize_by(question_id: question.id,
answer_id: answer.id)
qa.save!
# Associate appropriate answer with registration
TempRegistration.where(dietary_choice_id: dietary_choice.id).each do |registration|
TempQanswerRegistration.find_or_create_by!(registration_id: registration.id,
qanswer_id: qa.id)
end
end
end
end
# Migrate other_dietary_choice to a question and put data in other_special_needs
TempRegistration.all.each do |registration|
if registration.other_dietary_choice.present?
conference = TempConference.find(registration.conference_id)
qtype = TempQuestionType.find_or_create_by!(title: 'Yes/No')
question = TempQuestion.find_or_initialize_by(title: 'Do you have another dietary choice?',
conference_id: conference.id,
question_type_id: qtype.id)
question.save!
# Enable the question for the conference
TempConferencesQuestions.find_or_create_by!(conference_id: conference.id,
question_id: question.id)
# Create 'Yes' answer
answer_yes = TempAnswer.find_or_create_by!(title: 'Yes')
# Associate answer with the question
qa = TempQanswer.find_or_initialize_by(question_id: question.id,
answer_id: answer_yes.id)
qa.save!
# Associate appropriate answer with registration
TempQanswerRegistration.find_or_create_by!(registration_id: registration.id,
qanswer_id: qa.id)
# Move data from other_dietary_choice to other_special_needs
registration.other_special_needs << "Other dietary choice: #{registration.other_dietary_choice}."
registration.save!
end
end
remove_column :conferences, :use_dietary_choices
remove_column :registrations, :dietary_choice_id
remove_column :registrations, :other_dietary_choice
drop_table :dietary_choices
end
def down
create_table :dietary_choices do |t|
t.references :conference
t.string :title, null: false
t.timestamps
end
add_column :conferences, :use_dietary_choices, :boolean
add_column :registrations, :dietary_choice_id, :integer
add_column :registrations, :other_dietary_choice, :text
qtype = TempQuestionType.find_by(title: 'Single Choice')
TempConference.all.each do |conference|
if qtype && (question = TempQuestion.find_by(title: 'Which is your dietary choice?',
conference_id: conference.id, question_type_id: qtype.id))
TempQanswer.where(question_id: question.id).each do |qa|
TempQanswerRegistration.where(qanswer_id: qa.id).each do |qa_registration|
answer = TempAnswer.find(qa.answer_id)
registration = TempRegistration.find(qa_registration.registration_id)
dietary_choice = TempDietaryChoice.find_or_create_by!(title: answer.title,
conference_id: conference.id)
registration.dietary_choice_id = dietary_choice.id
registration.save!
end
end
end
end
qtype = TempQuestionType.find_by(title: 'Yes/No')
answer_yes = TempAnswer.find_by(title: 'Yes')
TempConference.all.each do |conference|
if qtype && (question = TempQuestion.find_by(title: 'Do you have another dietary choice?',
conference_id: conference.id, question_type_id: qtype.id))
TempQanswer.where(question_id: question.id, answer_id: answer_yes.id).each do |qa|
TempQanswerRegistration.where(qanswer_id: qa.id).each do |qa_registration|
registration = TempRegistration.find(qa_registration.registration_id)
registration.other_dietary_choice = 'Yes'
registration.save!
end
end
end
end
end
end