jam-cloud/ruby/lib/jam_ruby/models/broadcast_notification.rb

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