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



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

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



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

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

#available?Boolean

Returns:

  • (Boolean)


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

def available?
  started? && !ended?
end

#available_dateObject



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

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)


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

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)


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

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

#started?Boolean

Returns:

  • (Boolean)


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

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

#to_sObject



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

def to_s
  title.presence || model_name.human
end

#users(except_completed: false) ⇒ Object



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
119
120
121
# File 'app/models/effective/poll.rb', line 92

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