module DirModel::Model::Relations

Public Instance Methods

append_dir_model(source_path, options={}) click to toggle source

Appends model to the parent and returns it

@return [Model] return the child if it is valid, otherwise returns nil

# File lib/dir_model/model/relations.rb, line 22
def append_dir_model(source_path, options={})
  relation_name = options[:relation_name]
  _options      = options[:relation_options]
  related_class = _options[:dir_model_class]
  foreign_key   = _options[:foreign_key]
  foreign_value = self.send(foreign_key)

  related_dir_model = related_class.new(source_path,
    options.reverse_merge(parent: self, foreign_value: foreign_value))

  return unless related_dir_model

  unless related_dir_model.skip?
    if public_send(relation_name).present?
      raise StandardError.new("There are more of one #{relation_name} => #{related_class} for #{self.class.name}")
    end
    public_send("#{relation_name}=", related_dir_model)
    related_dir_model
  else
    nil
  end
end
append_dir_models(source_path, options={}) click to toggle source

Appends modeld to the parent and returns it

@return [Model] return the child if it is valid, otherwise returns nil

# File lib/dir_model/model/relations.rb, line 48
def append_dir_models(source_path, options={})
  relation_name = self.class.has_many_relationship.keys.first
  _options      = self.class.has_many_relationship.values.first
  related_class = _options[:dir_model_class]
  foreign_key   = _options[:foreign_key]
  foreign_value = self.send(foreign_key)

  related_dir_model = related_class.new(source_path,
    options.reverse_merge(parent: self, foreign_value: foreign_value))

  return unless related_dir_model

  unless related_dir_model.skip?
    public_send(relation_name) << related_dir_model
    related_dir_model
  else
    nil
  end
end
child?() click to toggle source

@return [Boolean] returns true, if the instance is a child

# File lib/dir_model/model/relations.rb, line 11
def child?
  !!parent
end
has_many(relation_name, dir_model_class, options) click to toggle source

Defines a relationship between a dir model

@param [Symbol] relation_name the name of the relation @param [DirModel::Import] dir_model_class class of the relation @param [Hash] basically for set :foreign_key

# File lib/dir_model/model/relations.rb, line 112
def has_many(relation_name, dir_model_class, options)
  raise "for now, DirModel's has_many may only be called once" if @_has_many_relationship.present?
  relation_name = relation_name.to_sym

  has_many_relationship_object.merge(relation_name => { dir_model_class: dir_model_class }.merge(options))

  define_method(:has_many?) do
    true
  end

  define_method(relation_name) do
    #
    # equal to: @relation_name ||= []
    #
    variable_name = "@#{relation_name}"
    instance_variable_get(variable_name) || instance_variable_set(variable_name, [])
  end
end
has_many?() click to toggle source
# File lib/dir_model/model/relations.rb, line 72
def has_many?
  false
end
has_one(relation_name, dir_model_class, options) click to toggle source

Defines a relationship between a dir model

@param [Symbol] relation_name the name of the relation @param [DirModel::Import] dir_model_class class of the relation

# File lib/dir_model/model/relations.rb, line 81
def has_one(relation_name, dir_model_class, options)
  relation_name = relation_name.to_sym

  has_one_relationship_object.merge(relation_name => { dir_model_class: dir_model_class }.merge(options))

  define_method(:has_one?) do
    true
  end

  define_method(:has_one) do
    self.class.has_one_relationship
  end

  define_method("#{relation_name}=") do |value|
    instance_variable_set("@#{relation_name}", value)
  end

  define_method(relation_name) do
    instance_variable_get("@#{relation_name}")
  end
end
has_one?() click to toggle source
# File lib/dir_model/model/relations.rb, line 68
def has_one?
  false
end
has_relations?() click to toggle source
# File lib/dir_model/model/relations.rb, line 15
def has_relations?
  has_one? || has_many?
end