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