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



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

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



142
143
144
# File 'app/models/effective/poll.rb', line 142

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

#available?Boolean

Returns:

  • (Boolean)


120
121
122
# File 'app/models/effective/poll.rb', line 120

def available?
  started? && !ended?
end

#available_dateObject



132
133
134
135
136
137
138
139
140
# File 'app/models/effective/poll.rb', line 132

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)


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

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)


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

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

#poll_results(poll_question: nil) ⇒ Object

Returns all completed_ballot_responses



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

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)


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

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

#to_sObject



74
75
76
# File 'app/models/effective/poll.rb', line 74

def to_s
  title.presence || model_name.human
end

#users(except_completed: false) ⇒ Object



89
90
91
92
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
# File 'app/models/effective/poll.rb', line 89

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