class DynamicActiveModel::Associations
DynamicActiveModel::Associations
iterates over the models of a
database and adds has_many and belongs_to based on foreign keys
Attributes
database[R]
Public Class Methods
new(database)
click to toggle source
# File lib/dynamic-active-model/associations.rb, line 9 def initialize(database) @database = database @foreign_keys = database.models.each_with_object({}) do |model, hsh| hsh[model.table_name] = ForeignKey.new(model) end end
Public Instance Methods
add_foreign_key(table_name, foreign_key, relationship_name = nil)
click to toggle source
# File lib/dynamic-active-model/associations.rb, line 16 def add_foreign_key(table_name, foreign_key, relationship_name = nil) @foreign_keys[table_name].add(foreign_key, relationship_name) end
build!()
click to toggle source
iterates over the models and adds relationships
# File lib/dynamic-active-model/associations.rb, line 21 def build! foreign_key_to_models = create_foreign_key_to_model_map @database.models.each do |model| model.column_names.each do |column_name| next unless foreign_key_to_models[column_name.downcase] foreign_key_to_models[column_name.downcase].each do |foreign_model, relationship_name| next if foreign_model == model add_relationships(relationship_name, model, foreign_model, column_name) end end end end
Private Instance Methods
add_belongs_to(relationship_name, model, belongs_to_model, foreign_key)
click to toggle source
# File lib/dynamic-active-model/associations.rb, line 44 def add_belongs_to(relationship_name, model, belongs_to_model, foreign_key) model.belongs_to( relationship_name.singularize.to_sym, class_name: belongs_to_model.name, foreign_key: foreign_key, primary_key: belongs_to_model.primary_key ) end
add_has_many(relationship_name, model, has_many_model, foreign_key)
click to toggle source
# File lib/dynamic-active-model/associations.rb, line 53 def add_has_many(relationship_name, model, has_many_model, foreign_key) model.has_many( generate_has_many_association_name(relationship_name, model, has_many_model), class_name: has_many_model.name, foreign_key: foreign_key, primary_key: has_many_model.primary_key ) end
add_relationships(relationship_name, model, belongs_to_model, foreign_key)
click to toggle source
# File lib/dynamic-active-model/associations.rb, line 39 def add_relationships(relationship_name, model, belongs_to_model, foreign_key) add_belongs_to(relationship_name, model, belongs_to_model, foreign_key) add_has_many(relationship_name, belongs_to_model, model, foreign_key) end
create_foreign_key_to_model_map()
click to toggle source
# File lib/dynamic-active-model/associations.rb, line 62 def create_foreign_key_to_model_map @foreign_keys.values.each_with_object({}) do |foreign_key, hsh| foreign_key.keys.each do |key, relationship_name| hsh[key.downcase] ||= [] hsh[key.downcase] << [foreign_key.model, relationship_name] end end end
generate_has_many_association_name(relationship_name, model, has_many_model)
click to toggle source
# File lib/dynamic-active-model/associations.rb, line 71 def generate_has_many_association_name(relationship_name, model, has_many_model) name = if relationship_name == model.table_name.underscore has_many_model.table_name else relationship_name + '_' + has_many_model.table_name end name.underscore.pluralize.to_sym end