diff --git a/app/models/legislation/answer.rb b/app/models/legislation/answer.rb new file mode 100644 index 000000000..fd4bc90ed --- /dev/null +++ b/app/models/legislation/answer.rb @@ -0,0 +1,9 @@ +class Legislation::Answer < ActiveRecord::Base + belongs_to :question, class_name: 'Legislation::Question', foreign_key: 'legislation_question_id', dependent: :destroy, inverse_of: :answers, counter_cache: true + belongs_to :question_option, class_name: 'Legislation::QuestionOption', foreign_key: 'legislation_question_option_id', dependent: :destroy, inverse_of: :answers, counter_cache: true + belongs_to :user, dependent: :destroy, inverse_of: :legislation_answers + + validates :question, presence: true, uniqueness: { scope: :user_id} + validates :question_option, presence: true + validates :user, presence: true +end diff --git a/app/models/legislation/question.rb b/app/models/legislation/question.rb index 2b779d1f8..e80d169ce 100644 --- a/app/models/legislation/question.rb +++ b/app/models/legislation/question.rb @@ -6,6 +6,7 @@ class Legislation::Question < ActiveRecord::Base belongs_to :process, class_name: 'Legislation::Process', foreign_key: 'legislation_process_id' has_many :question_options, class_name: 'Legislation::QuestionOption', foreign_key: 'legislation_question_id', dependent: :destroy, inverse_of: :question + has_many :answers, class_name: 'Legislation::Answer', foreign_key: 'legislation_question_id', dependent: :destroy, inverse_of: :question has_many :comments, as: :commentable accepts_nested_attributes_for :question_options, :reject_if => proc { |attributes| attributes[:value].blank? }, allow_destroy: true diff --git a/app/models/legislation/question_option.rb b/app/models/legislation/question_option.rb index 93bc20320..f7927dd1a 100644 --- a/app/models/legislation/question_option.rb +++ b/app/models/legislation/question_option.rb @@ -3,6 +3,7 @@ class Legislation::QuestionOption < ActiveRecord::Base include ActsAsParanoidAliases belongs_to :question, class_name: 'Legislation::Question', foreign_key: 'legislation_question_id', inverse_of: :question_options + has_many :answers, class_name: 'Legislation::Answer', foreign_key: 'legislation_question_id', dependent: :destroy, inverse_of: :question validates :question, presence: true validates :value, presence: true, uniqueness: { scope: :legislation_question_id } diff --git a/app/models/user.rb b/app/models/user.rb index 03f2db27b..4ded8d99e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -25,6 +25,7 @@ class User < ActiveRecord::Base has_many :notifications has_many :direct_messages_sent, class_name: 'DirectMessage', foreign_key: :sender_id has_many :direct_messages_received, class_name: 'DirectMessage', foreign_key: :receiver_id + has_many :legislation_answers, class_name: 'Legislation::Answer', dependent: :destroy, inverse_of: :user belongs_to :geozone validates :username, presence: true, if: :username_required? diff --git a/db/migrate/20161222115744_create_legislation_answers.rb b/db/migrate/20161222115744_create_legislation_answers.rb new file mode 100644 index 000000000..0c8170d68 --- /dev/null +++ b/db/migrate/20161222115744_create_legislation_answers.rb @@ -0,0 +1,13 @@ +class CreateLegislationAnswers < ActiveRecord::Migration + def change + create_table :legislation_answers do |t| + t.references :legislation_question, index: true + t.references :legislation_question_option, index: true + t.references :user, index: true + + t.datetime :hidden_at, index: true + + t.timestamps null: false + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 0438a3328..e9e672e08 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -227,6 +227,20 @@ ActiveRecord::Schema.define(version: 20161222180927) do t.datetime "updated_at", null: false end + create_table "legislation_answers", force: :cascade do |t| + t.integer "legislation_question_id" + t.integer "legislation_question_option_id" + t.integer "user_id" + t.datetime "hidden_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + add_index "legislation_answers", ["hidden_at"], name: "index_legislation_answers_on_hidden_at", using: :btree + add_index "legislation_answers", ["legislation_question_id"], name: "index_legislation_answers_on_legislation_question_id", using: :btree + add_index "legislation_answers", ["legislation_question_option_id"], name: "index_legislation_answers_on_legislation_question_option_id", using: :btree + add_index "legislation_answers", ["user_id"], name: "index_legislation_answers_on_user_id", using: :btree + create_table "legislation_draft_versions", force: :cascade do |t| t.integer "legislation_process_id" t.string "title" diff --git a/spec/factories.rb b/spec/factories.rb index f14edf6ea..731e1fef1 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -411,4 +411,10 @@ FactoryGirl.define do question factory: :legislation_question sequence(:value) { |n| "Option #{n}" } end + + factory :legislation_answer, class: 'Legislation::Answer' do + question factory: :legislation_question + question_option factory: :legislation_question_option + user + end end diff --git a/spec/models/legislation/answer_spec.rb b/spec/models/legislation/answer_spec.rb new file mode 100644 index 000000000..9f5037081 --- /dev/null +++ b/spec/models/legislation/answer_spec.rb @@ -0,0 +1,39 @@ +require 'rails_helper' + +RSpec.describe Legislation::Answer, type: :model do + let(:legislation_answer) { build(:legislation_answer) } + + it "should be valid" do + expect(legislation_answer).to be_valid + end + + it "counts answers" do + question = create(:legislation_question) + option_1 = create(:legislation_question_option, question: question, value: 'Yes') + option_2 = create(:legislation_question_option, question: question, value: 'No') + + answer = create(:legislation_answer, question: question, question_option: option_2) + + expect(answer).to be_valid + expect(question.answers_count).to eq 1 + expect(option_2.answers_count).to eq 1 + expect(option_1.answers_count).to eq 0 + end + + it "can't answer same question more than once" do + question = create(:legislation_question) + option_1 = create(:legislation_question_option, question: question, value: 'Yes') + option_2 = create(:legislation_question_option, question: question, value: 'No') + user = create(:user) + + answer = create(:legislation_answer, question: question, question_option: option_2, user: user) + expect(answer).to be_valid + + second_answer = build(:legislation_answer, question: question, question_option: option_1, user: user) + expect(second_answer).to be_invalid + + expect(question.answers_count).to eq 1 + expect(option_2.answers_count).to eq 1 + expect(option_1.answers_count).to eq 0 + end +end