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



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

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



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

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

#available?Boolean

Returns:

  • (Boolean)


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

def available?
  started? && !ended?
end

#available_dateObject



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

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)


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

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)


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

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

#poll_results(poll_question: nil) ⇒ Object

Returns all completed_ballot_responses



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

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)


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

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

#to_sObject



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

def to_s
  title.presence || model_name.human
end

#users(except_completed: false) ⇒ Object



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
123
# File 'app/models/effective/poll.rb', line 94

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