Class: LikeSystem::Like

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
lib/like_system/like.rb

Overview

Like class

This class defines the like model in like system

Class Method Summary collapse

Class Method Details

.like(liker, likee) ⇒ Boolean

Creates a LikeSystem::Like relationship between a LikeSystem::Liker object and a LikeSystem::Likee object

Parameters:

Returns:

  • (Boolean)


30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/like_system/like.rb', line 30

def self.like(liker, likee)
  validate_likee(likee)
  validate_liker(liker)

  if likes?(liker, likee)
    false
  else
    like = scope_by_liker(liker).scope_by_likee(likee).build
    like.save
    true
  end
end

.likes?(liker, likee) ⇒ Boolean

Specifies if a LikeSystem::Liker object likes a LikeSystem::Likee object

Parameters:

Returns:

  • (Boolean)


88
89
90
91
92
93
# File 'lib/like_system/like.rb', line 88

def self.likes?(liker, likee)
  validate_likee(likee)
  validate_liker(liker)

  scope_by_liker(liker).scope_by_likee(likee).exists?
end

.scope_by_likee(likee) ⇒ ActiveRecord::Relation

Retrieves a scope of LikeSystem::Like objects filtered by a LikeSystem::Likee object

Parameters:

Returns:

  • (ActiveRecord::Relation)


101
102
103
# File 'lib/like_system/like.rb', line 101

def self.scope_by_likee(likee)
  where(likee: likee)
end

.scope_by_likee_type(klass) ⇒ ActiveRecord::Relation

Retrieves a scope of LikeSystem::Like objects filtered by a LikeSystem::Likee type

Parameters:

  • klass (Class)
    • the Class to filter

Returns:

  • (ActiveRecord::Relation)


111
112
113
# File 'lib/like_system/like.rb', line 111

def self.scope_by_likee_type(klass)
  where(likee_type: klass.to_s.classify)
end

.scope_by_liker(liker) ⇒ ActiveRecord::Relation

Retrieves a scope of LikeSystem::Like objects filtered by a LikeSystem::Liker object

Parameters:

Returns:

  • (ActiveRecord::Relation)


121
122
123
# File 'lib/like_system/like.rb', line 121

def self.scope_by_liker(liker)
  where(liker: liker)
end

.scope_by_liker_type(klass) ⇒ ActiveRecord::Relation

Retrieves a scope of LikeSystem::Like objects filtered by a LikeSystem::Liker type

Parameters:

  • klass (Class)
    • the Class to filter

Returns:

  • (ActiveRecord::Relation)


131
132
133
# File 'lib/like_system/like.rb', line 131

def self.scope_by_liker_type(klass)
  where(liker_type: klass.to_s.classify)
end

.toggle_like(liker, likee) ⇒ Boolean

Toggles a LikeSystem::Like relationship between a LikeSystem::Liker object and a LikeSystem::Likee object

Parameters:

Returns:

  • (Boolean)


70
71
72
73
74
75
76
77
78
79
# File 'lib/like_system/like.rb', line 70

def self.toggle_like(liker, likee)
  validate_likee(likee)
  validate_liker(liker)

  if likes?(liker, likee)
    unlike(liker, likee)
  else
    like(liker, likee)
  end
end

.unlike(liker, likee) ⇒ Boolean

Destroys a LikeSystem::Like relationship between a LikeSystem::Liker object and a LikeSystem::Likee object

Parameters:

Returns:

  • (Boolean)


50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/like_system/like.rb', line 50

def self.unlike(liker, likee)
  validate_likee(likee)
  validate_liker(liker)

  if likes?(liker, likee)
    like = scope_by_liker(liker).scope_by_likee(likee).take
    like.destroy
    true
  else
    false
  end
end

.validate_likee(likee) ⇒ Object (private)

Validates a likee object

Raises:

  • (ArgumentError)

    if the likee object is invalid



141
142
143
# File 'lib/like_system/like.rb', line 141

def self.validate_likee(likee)
  raise ArgumentError.new unless likee.respond_to?(:is_likee?) && likee.is_likee?
end

.validate_liker(liker) ⇒ Object (private)

Validates a liker object

Raises:

  • (ArgumentError)

    if the liker object is invalid



150
151
152
# File 'lib/like_system/like.rb', line 150

def self.validate_liker(liker)
  raise ArgumentError.new unless liker.respond_to?(:is_liker?) && liker.is_liker?
end