class LocalModel::Model

Public Class Methods

belongs_to(association, class_name: nil, foreign_key: nil) click to toggle source
# File lib/local_model/model.rb, line 8
def self.belongs_to(association, class_name: nil, foreign_key: nil)
  if class_name.nil?
    association_class_name = LocalModel::Functions.snake_to_camel(association)
    association_class_name[0] = association_class_name[0].upcase
    association_class_name = namespace_classname(association_class_name)
  else
    association_class_name = namespace_classname(class_name)
  end

  if foreign_key.nil?
    keyname = "#{association}_id"
  else
    keyname = foreign_key
  end

  define_method association do
    association_class = Object.const_get(association_class_name)
    id = self.send(keyname)
    association_class.find(id)
  end

  define_method "#{association}=" do |association_obj|
    self.send("#{keyname}=", association_obj&.id)
  end
end
has_many(association, through: nil, class_name: nil, foreign_key: nil) click to toggle source
# File lib/local_model/model.rb, line 34
def self.has_many(association, through: nil, class_name: nil, foreign_key: nil)
  if class_name.nil?
    association_classname = namespace_classname(get_classname_from_association(association))
  else
    association_classname = namespace_classname(class_name)
  end

  if through.nil?
    current_class_id_methodname = foreign_key || "#{LocalModel::Functions.camel_to_snake(denamespace_classname(self))}_id"
    belongs_to_id_sym = current_class_id_methodname.to_sym
    add_to_collection = Proc.new do |arg, model|
      arg.send("#{belongs_to_id_sym}=", model.id)
    end
    define_method association do
      association_class = Object.const_get(association_classname)
      LocalModel::Collection.create_from(
        array: association_class.where(belongs_to_id_sym => self.id),
        for_model: self,
        for_collection_class: association_class,
        add_to_collection_proc: add_to_collection
      )
    end
  else
    current_class_id_methodname = foreign_key || "#{LocalModel::Functions.camel_to_snake(LocalModel::Functions.singularize(association))}_id"
    belongs_to_id_sym = current_class_id_methodname.to_sym
    add_to_collection = Proc.new do |arg, model|
      through_collection = model.send(through)
      through_classname = through_collection.collection_class
      new_join = through_classname.new
      new_join.send("#{belongs_to_id_sym}=", arg.id)
      through_collection << new_join
    end
    define_method association do 
      association_class = Object.const_get(association_classname)
      LocalModel::Collection.create_from(
        array: self.send(through).map{|through_obj| association_class.find(through_obj.send(belongs_to_id_sym))},
        for_model: self,
        for_collection_class: association_class,
        add_to_collection_proc: add_to_collection
      )
    end
  end
end
has_one(association, through: nil, class_name: nil, foreign_key: nil) click to toggle source
# File lib/local_model/model.rb, line 78
def self.has_one(association, through: nil, class_name: nil, foreign_key: nil)
  if class_name.nil?
    association_classname = LocalModel::Functions.snake_to_camel(association)
    association_classname[0] = association_classname[0].upcase
    association_classname = namespace_classname(association_classname)
  else
    association_classname = namespace_classname(class_name)
  end

  if through.nil?
    current_class_id_methodname = foreign_key || "#{LocalModel::Functions.camel_to_snake(denamespace_classname(self))}_id"
    belongs_to_id_sym = current_class_id_methodname.to_sym
    define_method association do 
      association_class = Object.const_get(association_classname)
      association_class.where(belongs_to_id_sym => self.id).first
    end
  else
    current_class_id_methodname = foreign_key || "#{LocalModel::Functions.camel_to_snake(association)}_id"
    belongs_to_id_sym = current_class_id_methodname.to_sym
    define_method association do 
      association_class = Object.const_get(association_classname)
      association_class.where(id: self.send(through)&.send(belongs_to_id_sym)).first
    end
  end
end
schema(&block) click to toggle source
# File lib/local_model/model.rb, line 3
def self.schema(&block)
  raise NoMethodError.new("self.schema must be defined")
  # yield(SchemaBuilder.new(self))
end
storage_path() click to toggle source
# File lib/local_model/model.rb, line 130
def self.storage_path
  slash = LocalModel.path == '/' ? '' : '/'
  "#{LocalModel.path}#{slash}#{self}.csv"
end

Private Class Methods

denamespace_classname(classname) click to toggle source
# File lib/local_model/model.rb, line 116
def self.denamespace_classname(classname)
  return classname.to_s.split("::").last
end
get_classname_from_association(association) click to toggle source
# File lib/local_model/model.rb, line 104
def self.get_classname_from_association(association)
  association_portions = association.to_s.split('_')
  association_portions_last = association_portions.last
  singular_association_last = LocalModel::Functions.singularize(association_portions_last)
  singularized_association = association_portions[0...-1] + [singular_association_last]
  singularized_snakecase = singularized_association.join('_')
  classname = LocalModel::Functions.snake_to_camel(singularized_snakecase)
  classname[0] = classname[0].upcase
  classname
end
namespace_classname(classname) click to toggle source
# File lib/local_model/model.rb, line 121
def self.namespace_classname(classname)
  if LocalModel.namespaced?
    "#{LocalModel.namespace}::#{classname}"
  else
    classname
  end
end