module ActsInRelation::Core::ClassMethods

Public Instance Methods

acts_in_relation(**args) click to toggle source

DSL called to a subclass of ActiveRecord::Base

@param [Hash] args Define relation with :role, :action, :source, :target or :self.

@example Define self relation

class User < ActiveRecord::Base
  acts_in_relation role: :self, action: [:follow, :block]
end

class Follow < ActiveRecord::Base
  acts_in_relation role: :action, self: :user
end

class Block < ActiveRecord::Base
  acts_in_relation role: :action, self: :user
end

@example Define relation of each models

class User < ActiveRecord::Base
  acts_in_relation role: :source, target: :post, action: :like
end

class Post < ActiveRecord::Base
  acts_in_relation role: :target, source: :user, action: :like
end

class Like < ActiveRecord::Base
  acts_in_relation role: :action, source: :user, target: :post
end
# File lib/acts_in_relation/core.rb, line 39
def acts_in_relation(**args)
  @args = args

  case @args[:role]
  when nil
    raise ActsInRelation::MissingRoleError
  when :source
    define_source
  when :target
    define_target
  when :action
    define_action
  when :self
    define_source
    define_target
  else
    raise ActsInRelation::UnknownRoleError, @args[:role]
  end
end

Private Instance Methods

define_action() click to toggle source
# File lib/acts_in_relation/core.rb, line 69
def define_action
  ActsInRelation::Roles::Action.new(@args).define
end
define_source() click to toggle source
# File lib/acts_in_relation/core.rb, line 61
def define_source
  ActsInRelation::Roles::Source.new(@args).define
end
define_target() click to toggle source
# File lib/acts_in_relation/core.rb, line 65
def define_target
  ActsInRelation::Roles::Target.new(@args).define
end