class DynamicActiveModel::TemplateClassFile

DynamicActiveModel::TemplateClassFile creates ActiveRecord file for model

Public Class Methods

new(model) click to toggle source
# File lib/dynamic-active-model/template_class_file.rb, line 6
def initialize(model)
  @model = model
end

Public Instance Methods

create_template!(dir) click to toggle source
# File lib/dynamic-active-model/template_class_file.rb, line 10
def create_template!(dir)
  file = dir + '/' + @model.name.underscore + '.rb'
  File.open(file, 'wb') { |f| f.write(to_s) }
end
to_s() click to toggle source
# File lib/dynamic-active-model/template_class_file.rb, line 15
def to_s
  str = "class #{@model.name} < ActiveRecord::Base\n".dup
  str << "  self.table_name = #{@model.table_name.to_sym.inspect}\n" unless @model.name.underscore.pluralize == @model.table_name
  all_has_many_relationships.each do |assoc|
    append_association!(str, assoc)
  end
  all_belongs_to_relationships.each do |assoc|
    append_association!(str, assoc)
  end
  str << "end\n"
  str
end

Private Instance Methods

all_belongs_to_relationships() click to toggle source
# File lib/dynamic-active-model/template_class_file.rb, line 36
def all_belongs_to_relationships
  @model.reflect_on_all_associations.select do |assoc|
    assoc.is_a?(ActiveRecord::Reflection::BelongsToReflection)
  end
end
all_has_many_relationships() click to toggle source
# File lib/dynamic-active-model/template_class_file.rb, line 30
def all_has_many_relationships
  @model.reflect_on_all_associations.select do |assoc|
    assoc.is_a?(ActiveRecord::Reflection::HasManyReflection)
  end
end
append_association!(str, assoc) click to toggle source
# File lib/dynamic-active-model/template_class_file.rb, line 42
def append_association!(str, assoc)
  assoc_type = assoc.is_a?(ActiveRecord::Reflection::HasManyReflection) ? 'has_many' : 'belongs_to'
  association_options = assoc_type == 'has_many' ? has_many_association_options(assoc) : belongs_to_association_options(assoc)
  str << "  #{assoc_type} #{assoc.name.inspect}"
  unless association_options.empty?
    association_options.each do |name, value|
      str << ", #{name}: '#{value}'"
    end
  end
  str << "\n"
end
belongs_to_association_options(assoc) click to toggle source
# File lib/dynamic-active-model/template_class_file.rb, line 62
def belongs_to_association_options(assoc)
  options = {}
  options[:class_name] = assoc.options[:class_name] unless assoc.options[:class_name] == assoc.name.to_s.classify
  options[:foreign_key] = assoc.options[:foreign_key] unless assoc.options[:foreign_key] == (assoc.options[:class_name].underscore + '_id')
  options[:primary_key] = assoc.options[:primary_key] unless assoc.options[:primary_key] == 'id'
  options
end
const_get(class_name) click to toggle source
# File lib/dynamic-active-model/template_class_file.rb, line 74
def const_get(class_name)
  class_name.split('::').inject(Object) { |mod, name| mod.const_get(name) }
end
default_foreign_key_name() click to toggle source
# File lib/dynamic-active-model/template_class_file.rb, line 70
def default_foreign_key_name
  @model.table_name.underscore.singularize + '_id'
end
has_many_association_options(assoc) click to toggle source
# File lib/dynamic-active-model/template_class_file.rb, line 54
def has_many_association_options(assoc)
  options = {}
  options[:class_name] = assoc.options[:class_name] unless assoc.options[:class_name].underscore.pluralize == assoc.name.to_s
  options[:foreign_key] = assoc.options[:foreign_key] unless assoc.options[:foreign_key] == default_foreign_key_name
  options[:primary_key] = assoc.options[:primary_key] unless assoc.options[:primary_key] == 'id'
  options
end