= acts_as_magic_model
Rails plugin to allow for extensible models, where inter-model
relations are inferred from the database's structure, and not
necessarily from explicit declarations in the models.
This means, when one of your models acts_as_magic_model, this plugin
will try to infer all the basic relations (+has_many+, +belongs_to+
and +has_and_belongs_to_many+) its base table has with other tables in
the database, adapting the model correspondingly.
= Installing the plugin
The easiest way is through Rails' own +scripts/plugins+ utility. The
first thing you should do is to tell Rails where the plugin's tree is
located.
If you want to follow the latest changes, you will probably prefer
following the project's trunk, however, for production, I strongly
suggest you to stick to a stable release. Depending on what you
prefer, from your project's base directory, type:
$ ./script/plugin source http://magicmodel.rubyforge.org/svn/trunk/
Or, to follow a given release (say, 0.2 - Of course, check on the
latest stable release before doing this):
$ ./script/plugin source http://magicmodel.rubyforge.org/svn/tags/0.2/
Then, ask Rails to install the plugin:
$ ./script/plugin install acts_as_magic_model
If you use Subversion for tracking your project's development, you
will probably want to mark the plugin as an external
repository. To do so, add the -x switch:
$ ./script/plugin install -x acts_as_magic_model
= Using the plugin
In order to use this plugin, you only have to declare it in your
model. As an example, say you have the proverbial project-management
system, where you have projects (each of which can be of several
different types) and people, and a HABTM relation between people and
projects. So, you have the following tables (expressed as migrations
here):
create_table :people, :force => true do |t|
t.column :name, :string
end
create_table :project_types, :force => true do |t|
t.column :name, :string
end
create_table :projects, :force => true do |t|
t.column :name, :string
t.column :project_type_id, :integer
end
create_table :people_projects, :force => true, :id => false do |t|
t.column :person_id, :integer
t.column :project_id, :integer
end
Using acts_as_magic_model, you can skip declaring the relations in
your models, like this: (of course, each of the classes still has to
be declared in its own file)
class Person < ActiveRecord::Base
acts_as_magic_model
end
class Project < ActiveRecord::Base
acts_as_magic_model
end
class ProjectType < ActiveRecord::Base
acts_as_magic_model
end
And the gaps will be filled in for you - that is, you can go on and
ask for Project.find(:first).people,
ProjectType.find(:first).projects.size,
Person.find(:first).projects.map {|pr| pr.project_type}, and
whatever you fancy.
== Dynamically created models
If any table is related to the models you are declaring as magic does
not have a corresponding model explicitly declared, an empty one will
be generated - That is, if you create a new table:
create_table :items, :force => true do |t|
t.column :name, :string
t.column :description, :string
end
add_column :people, :item_id
When you call Person for the first time, it will create a
Item model, just as if you had declared it like:
class Item < ActiveRecord::Base
has_many :people
end
But keep in mind that Item will not exist before Person is first
touched.
= TO DO
- Add the ability to specify whether to auto-declare missing classes
or just skip them
- Allow to be called globally, auto-declaring /all/ of the tables as
classes with acts_as_magic_model - would be great for prototyping at
least! (i.e. called from environment.rb?)
- Find some basic constraints and auto-declare validations
= Author, copyright and licensing
This plugin is Copyright (c) 2008 Gunnar Wolf
== Licensing information
This plugin is under a MIT license. For further information, please
check the LICENSE file.
= Getting the code
The plugin project's home page can be found at
http://rubyforge.org/projects/magicmodel/
The development branch of the SVN tree can be pulled anonymously from
http://magicmodel.rubyforge.org/svn/trunk/
Released versions can be found along the 'tags' directory of the SVN
tree, at http://magicmodel.rubyforge.org/svn/tags/