Optimize events listing
This commit is contained in:
parent
74505569c1
commit
a9a538d08c
|
@ -3,7 +3,7 @@ module Management
|
||||||
def index
|
def index
|
||||||
@conference = find_conference
|
@conference = find_conference
|
||||||
@filters = params[:filters] || {}
|
@filters = params[:filters] || {}
|
||||||
@events = EventSearch.new(scope: Event.where(conference: @conference).eager_load(:proposition, :proposer, :track, :event_type), filters: params[:filters]).results
|
@events = EventSearch.new(scope: Event.where(conference: @conference).eager_load(:participants_with_personal_profiles, :proposition, :proposer, :track, :event_type).preload(:conference), filters: params[:filters]).results
|
||||||
# @events = @conference.events.order(:title).includes(:proposition, :proposer, :track, :event_type)
|
# @events = @conference.events.order(:title).includes(:proposition, :proposer, :track, :event_type)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
module EventsHelper
|
module EventsHelper
|
||||||
def links_to_event_participants_for(event)
|
def links_to_event_participants_for(event)
|
||||||
event.participants.map do |participant|
|
event.participants_with_personal_profiles.map do |participant|
|
||||||
if participant.personal_profile(event.conference).present?
|
if participant.has_personal_profile?
|
||||||
profile = participant.personal_profile(event.conference)
|
link_to icon(:user, participant.name),
|
||||||
link_to icon(:user, profile.name),
|
management_conference_personal_profile_path(participant.personal_profile_id, conference_id: event.conference.id)
|
||||||
management_conference_personal_profile_path(profile, conference_id: event.conference.id)
|
|
||||||
else
|
else
|
||||||
link_to icon('user-plus', participant.email),
|
link_to icon('user-plus', participant.personal_email),
|
||||||
new_management_conference_personal_profile_path(conference_id: event.conference.id,
|
new_management_conference_personal_profile_path(conference_id: event.conference.id,
|
||||||
user_id: participant.id),
|
user_id: participant.id),
|
||||||
title: t('management.events.event.create_profile'), class: 'bg-danger'
|
title: t('management.events.event.create_profile'), class: 'bg-danger'
|
||||||
|
|
|
@ -9,6 +9,7 @@ class Event < ActiveRecord::Base
|
||||||
has_many :pending_participations, ->() { pending }, class_name: 'Participation'
|
has_many :pending_participations, ->() { pending }, class_name: 'Participation'
|
||||||
has_many :approved_participations, ->() { approved }, class_name: 'Participation'
|
has_many :approved_participations, ->() { approved }, class_name: 'Participation'
|
||||||
has_many :participants, through: :approved_participations
|
has_many :participants, through: :approved_participations
|
||||||
|
has_many :participants_with_personal_profiles, through: :approved_participations, source: :participant_with_personal_profile
|
||||||
has_many :conflict_counts, -> { order(number_of_conflicts: :desc) }, foreign_key: :left_id
|
has_many :conflict_counts, -> { order(number_of_conflicts: :desc) }, foreign_key: :left_id
|
||||||
|
|
||||||
belongs_to :event_type
|
belongs_to :event_type
|
||||||
|
@ -32,9 +33,7 @@ class Event < ActiveRecord::Base
|
||||||
accepts_nested_attributes_for :participations, allow_destroy: true
|
accepts_nested_attributes_for :participations, allow_destroy: true
|
||||||
|
|
||||||
def all_participants_have_profiles?
|
def all_participants_have_profiles?
|
||||||
participants.all? do |participant|
|
participants_with_personal_profiles.all? { |participant| participant.has_personal_profile? }
|
||||||
participant.personal_profile(conference).present?
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def proposer_profile
|
def proposer_profile
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
class Participant < ActiveRecord::Base
|
||||||
|
self.table_name = :participants
|
||||||
|
self.primary_key = :participant_id
|
||||||
|
|
||||||
|
def twitter=(handle)
|
||||||
|
write_attribute :twitter, handle.gsub(/\A@/,'') if handle
|
||||||
|
end
|
||||||
|
|
||||||
|
def name
|
||||||
|
"#{first_name} #{last_name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def has_personal_profile?
|
||||||
|
user_id.present?
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,5 +1,6 @@
|
||||||
class Participation < ActiveRecord::Base
|
class Participation < ActiveRecord::Base
|
||||||
belongs_to :participant, class_name: User
|
belongs_to :participant, class_name: User
|
||||||
|
has_one :participant_with_personal_profile, class_name: Participant
|
||||||
belongs_to :event
|
belongs_to :event
|
||||||
validates :participant_id, presence: true
|
validates :participant_id, presence: true
|
||||||
scope :approved, ->() { where approved: true }
|
scope :approved, ->() { where approved: true }
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
PARTICIPANTS_SQL = <<EOS
|
||||||
|
CREATE VIEW "participants" AS
|
||||||
|
SELECT "users"."id" AS "participant_id",
|
||||||
|
"users"."email" AS personal_email,
|
||||||
|
"users"."language" AS language,
|
||||||
|
"participations"."id" AS "participation_id",
|
||||||
|
"personal_profiles"."id" AS "personal_profile_id",
|
||||||
|
"personal_profiles".* FROM "users"
|
||||||
|
INNER JOIN "participations" ON "users"."id" = "participations"."participant_id"
|
||||||
|
INNER JOIN "events" ON "events"."id" = "participations"."event_id"
|
||||||
|
INNER JOIN "conferences" ON "events"."conference_id" = "conferences"."id"
|
||||||
|
LEFT JOIN "personal_profiles" ON "personal_profiles"."conference_id" = "events"."conference_id"
|
||||||
|
AND "personal_profiles"."user_id" = "users"."id";
|
||||||
|
EOS
|
||||||
|
|
||||||
|
class AddParticipantsView < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
execute PARTICIPANTS_SQL
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
execute 'DROP VIEW "participants"'
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue