Class: Effective::Poll

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/effective/poll.rb

Constant Summary collapse

AUDIENCES =
['All Users', 'Individual Users', 'Selected Users']

Instance Method Summary collapse

Instance Method Details

#audience_classObject



87
88
89
90
91
# File 'app/models/effective/poll.rb', line 87

def audience_class
  klass = audience_class_name.safe_constantize
  raise('expected an effective_polls_user klass') unless klass.try(:effective_polls_user?)
  klass
end

#audience_scopeObject



146
147
148
# File 'app/models/effective/poll.rb', line 146

def audience_scope
  Array(self[:audience_scope]) - [nil, '']
end

#available?Boolean

Returns:

  • (Boolean)


124
125
126
# File 'app/models/effective/poll.rb', line 124

def available?
  started? && !ended?
end

#available_dateObject



136
137
138
139
140
141
142
143
144
# File 'app/models/effective/poll.rb', line 136

def available_date
  if start_at && end_at && start_at.to_date == end_at.to_date
    "#{start_at.strftime('%F at %H:%M')} to #{end_at.strftime('%H:%M')}"
  elsif start_at && end_at
    "#{start_at.strftime('%F at %H:%M')} to #{end_at.strftime('%F %H:%M')}"
  elsif start_at
    "#{start_at.strftime('%F at %H:%M')}"
  end
end

#available_for?(user) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
85
# File 'app/models/effective/poll.rb', line 82

def available_for?(user)
  raise('expected an effective_polls_user') unless user.class.try(:effective_polls_user?)
  available? && users.include?(user)
end

#ended?Boolean

Returns:

  • (Boolean)


132
133
134
# File 'app/models/effective/poll.rb', line 132

def ended?
  end_at.present? && end_at < Time.zone.now
end

#poll_results(poll_question: nil) ⇒ Object

Returns all completed_ballot_responses



151
152
153
154
# File 'app/models/effective/poll.rb', line 151

def poll_results(poll_question: nil)
  return completed_ballot_responses if poll_question.nil?
  completed_ballot_responses.select { |br| br.poll_question_id == poll_question.id }
end

#started?Boolean

Returns:

  • (Boolean)


128
129
130
# File 'app/models/effective/poll.rb', line 128

def started?
  start_at_was.present? && Time.zone.now >= start_at_was
end

#to_sObject



78
79
80
# File 'app/models/effective/poll.rb', line 78

def to_s
  title.presence || model_name.human
end

#users(except_completed: false) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'app/models/effective/poll.rb', line 93

def users(except_completed: false)
  klass = audience_class()
  resource = klass.new

  users = case audience
  when 'All Users'
    klass.try(:unarchived) || klass.all
  when 'Individual Users'
    (klass.try(:unarchived) || klass.all).where(id: audience_scope)
  when 'Selected Users'
    collection = klass.none

    audience_scope.each do |scope| 
      relation = resource.poll_audience_scope(scope)
      raise("invalid poll_audience_scope for #{scope}") unless relation.kind_of?(ActiveRecord::Relation)

      collection = collection.or(relation)
    end

    collection
  else
    raise('unexpected audience')
  end

  if except_completed
    users = users.where.not(id: completed_ballots.select('user_id as id'))
  end

  users
end