app/models/friendship.rb
class Friendship < ActiveRecord::Base
@@daily_request_limit = 12
cattr_accessor :daily_request_limit
belongs_to :user
belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"
has_enumerated :friendship_status, :class_name => 'FriendshipStatus', :foreign_key => 'friendship_status_id'
validates_presence_of :friendship_status
validates_presence_of :user
validates_presence_of :friend
validates_uniqueness_of :friend_id, :scope => :user_id
validate :cannot_request_if_daily_limit_reached
validates_each :user_id do |record, attr, value|
record.errors.add attr, 'can not be same as friend' if record.user_id.eql?(record.friend_id)
end
# named scopes
scope :accepted, lambda {
#hack: prevents FriendshipStatus[:accepted] from getting called before the friendship_status records are in the db (only matters in testing ENV)
where("friendship_status_id = ?", FriendshipStatus[:accepted].id)
}
def cannot_request_if_daily_limit_reached
if new_record? && initiator && user.has_reached_daily_friend_request_limit?
errors.add(:base, "Sorry, you'll have to wait a little while before requesting any more friendships.")
end
end
before_validation(:on => :create){:set_pending}
after_save :notify_requester, :if => Proc.new{|fr| fr.accepted? && fr.initiator }
def reverse
Friendship.where('user_id = ? and friend_id = ?', self.friend_id, self.user_id).first
end
def denied?
friendship_status.eql?(FriendshipStatus[:denied])
end
def pending?
friendship_status.eql?(FriendshipStatus[:pending])
end
def accepted?
friendship_status.eql?(FriendshipStatus[:accepted])
end
def self.friends?(user, friend)
where("user_id = ? AND friend_id = ? AND friendship_status_id = ?", user.id, friend.id, FriendshipStatus[:accepted].id).first
end
def notify_requester
UserNotifier.friendship_accepted(self).deliver
end
private
def set_pending
friendship_status_id = FriendshipStatus[:pending].id
end
end