Introduce the Proposition model
Introduce an abstraction that is going to be used to propose models for other models that can accept propositions.
This commit is contained in:
parent
408457a765
commit
cc4f1e9c13
|
@ -0,0 +1,5 @@
|
|||
class Proposition < ActiveRecord::Base
|
||||
belongs_to :proposer, class_name: 'User'
|
||||
belongs_to :proposition_accepting, polymorphic: true
|
||||
belongs_to :proposable, polymorphic: true
|
||||
end
|
|
@ -0,0 +1,13 @@
|
|||
class CreatePropositions < ActiveRecord::Migration
|
||||
def change
|
||||
create_table :propositions do |t|
|
||||
t.references :proposer, index: true
|
||||
t.references :proposition_accepting, polymorphic: true
|
||||
t.index [:proposition_accepting_id, :proposition_accepting_type], name: 'proposition_accepting_index'
|
||||
t.references :proposable, polymorphic: true, index: true
|
||||
t.integer :status
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,15 @@
|
|||
class CreatePropositionsForExistingEvents < ActiveRecord::Migration
|
||||
def up
|
||||
events = execute 'SELECT * FROM events'
|
||||
|
||||
events.each do |event|
|
||||
execute "INSERT INTO propositions (proposer_id, proposition_accepting_id, proposition_accepting_type, proposable_id, proposable_type, status, created_at, updated_at)
|
||||
VALUES (#{event['user_id']}, #{event['track_id']}, 'Track', #{event['id']}, 'Event', #{event['state']}, '#{event['created_at']}', '#{event['updated_at']}')"
|
||||
end
|
||||
end
|
||||
|
||||
def down
|
||||
event_ids = execute('SELECT * FROM events').map { |event| event['id'] }
|
||||
execute "DELETE FROM propositions WHERE proposable_id IN (#{event_ids.join(', ')}) AND proposable_type = 'Event'"
|
||||
end
|
||||
end
|
|
@ -0,0 +1,8 @@
|
|||
FactoryGirl.define do
|
||||
factory :event do
|
||||
title { |n| "Event #{n}" }
|
||||
length { 60 }
|
||||
abstract { 'foo' }
|
||||
description { 'foo' }
|
||||
end
|
||||
end
|
|
@ -0,0 +1,7 @@
|
|||
FactoryGirl.define do
|
||||
factory :proposition do
|
||||
association :proposer, factory: :user
|
||||
association :proposition_accepting, factory: :track
|
||||
association :proposable, factory: :event
|
||||
end
|
||||
end
|
|
@ -0,0 +1,21 @@
|
|||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Proposition, type: :model do
|
||||
it 'belongs to a proposer' do
|
||||
user = create :user
|
||||
expect(create(:proposition, proposer: user).proposer).to eq user
|
||||
end
|
||||
|
||||
it 'belongs to a proposition_accepting' do
|
||||
track = create :track
|
||||
expect(create(:proposition, proposition_accepting: track).proposition_accepting).to eq track
|
||||
end
|
||||
|
||||
it 'belongs to a proposable' do
|
||||
event = create :event
|
||||
expect(create(:proposition, proposable: event).proposable).to eq event
|
||||
end
|
||||
|
||||
it 'is invalid without an existing proposition_accepting'
|
||||
it 'is invalid without an existing proposable'
|
||||
end
|
Loading…
Reference in New Issue