Introduce a Participation model

This model is responsible for the 1..n - 1..n relationship between an
event and the people that will participate in it.
This commit is contained in:
Petko Bordjukov 2015-07-29 17:54:41 +03:00
parent d8986f542d
commit 9ca34c5a22
8 changed files with 57 additions and 6 deletions

View File

@ -1,12 +1,9 @@
module Proposable module Proposable
extend ActiveSupport::Concern extend ActiveSupport::Concern
def proposer
proposition.proposer
end
included do included do
has_one :proposition, as: :proposable has_one :proposition, as: :proposable
has_one :proposer, through: :proposition
Proposition.defined_enums["status"].keys.each do |status| Proposition.defined_enums["status"].keys.each do |status|
scope status.to_sym, -> { joins(:proposition).where(propositions: {status: Proposition.defined_enums["status"][status]}) } scope status.to_sym, -> { joins(:proposition).where(propositions: {status: Proposition.defined_enums["status"][status]}) }

View File

@ -10,10 +10,10 @@ class Conference < ActiveRecord::Base
has_many :tracks has_many :tracks
has_many :halls has_many :halls
has_many :events, through: :tracks
has_many :event_types has_many :event_types
has_many :events, through: :tracks
has_one :call_for_participation, dependent: :destroy has_one :call_for_participation, dependent: :destroy
has_many :participant_profiles, class_name: 'PersonalProfile' has_many :participants, class_name: 'User', through: :events
accepts_nested_attributes_for :tracks, :halls, :event_types, reject_if: :all_blank, allow_destroy: true accepts_nested_attributes_for :tracks, :halls, :event_types, reject_if: :all_blank, allow_destroy: true

View File

@ -3,6 +3,12 @@ class Event < ActiveRecord::Base
has_one :track, through: :proposition, source: :proposition_accepting, source_type: Track has_one :track, through: :proposition, source: :proposition_accepting, source_type: Track
has_one :conference, through: :track has_one :conference, through: :track
has_many :participations
has_many :pending_participations, ->() { pending }, class_name: 'Participation'
has_many :approved_participations, ->() { approved }, class_name: 'Participation'
has_many :participants, through: :approved_participations
belongs_to :event_type belongs_to :event_type
validates :title, presence: true validates :title, presence: true

View File

@ -0,0 +1,7 @@
class Participation < ActiveRecord::Base
belongs_to :participant, class_name: User
belongs_to :event
scope :approved, ->() { where approved: true }
scope :pending, ->() { where.not approved: true }
end

View File

@ -0,0 +1,11 @@
class CreateParticipations < ActiveRecord::Migration
def change
create_table :participations do |t|
t.references :participant, index: true, foreign_key: true
t.references :event, index: true, foreign_key: true
t.boolean :approved, default: false
t.timestamps null: false
end
end
end

View File

@ -0,0 +1,18 @@
class Participation < ActiveRecord::Base; end
class PersonalProfile < ActiveRecord::Base; end
class CreateParticipationRecords < ActiveRecord::Migration
def up
event_to_speaker_profiles = execute 'SELECT * FROM events_speaker_profiles'
event_to_speaker_profiles.each do |event_to_speaker_profile|
Participation.create! event_id: event_to_speaker_profile['event_id'],
participant_id: PersonalProfile.find(event_to_speaker_profile['speaker_profile_id']).user_id,
approved: true
end
end
def down
Participation.destroy_all
end
end

View File

@ -0,0 +1,5 @@
class DropJoinTableEventsSepakerProfiles < ActiveRecord::Migration
def up
drop_table :events_speaker_profiles
end
end

View File

@ -0,0 +1,7 @@
FactoryGirl.define do
factory :participation do
association :participant, factory: :user
event
approved false
end
end