52 lines
1.7 KiB
Ruby
52 lines
1.7 KiB
Ruby
module JamRuby
|
|
class BroadcastNotification < ActiveRecord::Base
|
|
|
|
attr_accessible :title, :message, :button_label, :frequency, :button_url, as: :admin
|
|
|
|
has_many :user_views, class_name: 'JamRuby::BroadcastNotificationView', dependent: :destroy
|
|
|
|
validates :button_label, presence: true, length: {maximum: 14}
|
|
validates :message, presence: true, length: {maximum: 200}
|
|
validates :title, presence: true, length: {maximum: 50}
|
|
|
|
def self.next_broadcast(user)
|
|
self.viewable_notifications(user).limit(1).first
|
|
end
|
|
|
|
def self.viewable_notifications(user)
|
|
self.select('broadcast_notifications.*, bnv.updated_at AS bnv_updated_at')
|
|
.joins("LEFT OUTER JOIN broadcast_notification_views AS bnv ON bnv.broadcast_notification_id = broadcast_notifications.id AND (bnv.user_id IS NULL OR (bnv.user_id = '#{user.id}'))")
|
|
.where(['broadcast_notifications.frequency > 0'])
|
|
.where(['bnv.user_id IS NULL OR bnv.active_at < NOW()'])
|
|
.where(['bnv.user_id IS NULL OR broadcast_notifications.frequency > bnv.view_count'])
|
|
.order('bnv_updated_at NULLS FIRST')
|
|
end
|
|
|
|
def did_view(user)
|
|
bnv = BroadcastNotificationView
|
|
.where(broadcast_notification_id: self.id, user_id: user.id)
|
|
.limit(1)
|
|
.first
|
|
|
|
unless bnv
|
|
bnv = user_views.new()
|
|
bnv.user = user
|
|
bnv.active_at = Time.now - 10
|
|
end
|
|
|
|
bnv = user_views.new(user: user) unless bnv
|
|
bnv.view_count += 1
|
|
bnv.save
|
|
bnv
|
|
end
|
|
|
|
def frequency_distribution
|
|
@distribution ||= BroadcastNotificationView
|
|
.where(broadcast_notification_id: self.id)
|
|
.group(:view_count)
|
|
.count
|
|
end
|
|
|
|
end
|
|
end
|