Legislation Answer model
This commit is contained in:
9
app/models/legislation/answer.rb
Normal file
9
app/models/legislation/answer.rb
Normal file
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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?
|
||||
|
||||
13
db/migrate/20161222115744_create_legislation_answers.rb
Normal file
13
db/migrate/20161222115744_create_legislation_answers.rb
Normal file
@@ -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
|
||||
14
db/schema.rb
14
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"
|
||||
|
||||
@@ -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
|
||||
|
||||
39
spec/models/legislation/answer_spec.rb
Normal file
39
spec/models/legislation/answer_spec.rb
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user