Skip to content

Instantly share code, notes, and snippets.

@mislav
Created December 13, 2009 20:23
Show Gist options
  • Save mislav/255584 to your computer and use it in GitHub Desktop.
Save mislav/255584 to your computer and use it in GitHub Desktop.
Poor man's magic models
require 'active_record'
class ActiveRecord::Base
def self.magic!
connection.tables.map { |table|
klass = Class.new(self)
Object.send(:const_set, table.singularize.camelize, klass)
}.each { |model|
model.column_names.grep(/_id$/).each { |foreign_key|
name = foreign_key.sub(/_id$/, '')
model.belongs_to(name)
name.camelize.constantize.has_many(model.name.tableize)
}
}
end
end
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
ActiveRecord::Schema.define do
create_table "managers" do |t|
t.string "name"
end
create_table "employees" do |t|
t.string "name"
t.belongs_to "manager"
end
end
ActiveRecord::Base.magic!
mislav = Manager.create :name => "Mislav"
mislav.employees.create(:name => "Josh")
mislav.employees.create(:name => "Mike")
p Manager.first.employees.count
p Employee.first.manager
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment