Logo design: Kelly Rauwerdink,
@missingdink,
Dribbble.
Generates ActiveRecord models to fit a pre-existing Postgres database. Now you can use Rails with the db schema you always wanted. It's your convention over configuration.
- Your app is specific to Postgres and proud of it. You use the mature declarative data validation that only a real database can provide.
- You have inherited a database or are more comfortable creating one yourself.
- You're a grown-ass DBA who doesn't want to speak ORM baby-talk.
- Fully automatic. It just works.
- Creates a model for every table.
- Creates a comprehensive initial migration.
- Declares key-, uniqueness-, and presence-constraints.
- Creates associations.
- Adds custom validation methods for
CHECK
constraints.
- Set up a postgres db normally
- Set
config.active_record.schema_format = :sql
to use a SQLschema.rb
- After you have migrated up a table, use
rails generate reactive_record:install
- Go examine your generated models
First Include the reactive_record
gem in your project's
Gemfile
. Oh by the way, you'll have to use postgres in your
project. Setting up Rails for use with postgres is a bit outside
the scope of this document. Please see [Configuring a Database]
(http://guides.rubyonrails.org/configuring.html#configuring-a-database)
for what you need to do.
gem 'reactive_record'
Bundle to include the library
$ bundle
Next Tell ActiveRecord
to go into beast-mode. Edit your
config/application.rb
, adding this line to use sql as the schema
format:
module YourApp
class Application < Rails::Application
# other configuration bric-a-brac...
config.active_record.schema_format = :sql
end
end
Next Create the database(s) just like you normally would:
rake db:create
Next Generate a migration that will create the initial table:
$ rails generate migration create_employees
Use your SQL powers to craft some
DDL, perhaps
the "Hello, World!" of DB applications, employees
?
class CreateEmployees < ActiveRecord::Migration
def up
execute <<-SQL
CREATE TABLE employees (
id SERIAL,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
start_date DATE NOT NULL,
PRIMARY KEY (id),
CONSTRAINT company_email CHECK (email LIKE '%@example.com')
);
SQL
end
def down
drop_table :employees
end
end
Lastly Deploy the reactive_record
generator:
$ rails generate reactive_record:install
Go look at the generated file:
class Employees < ActiveRecord::Base
set_table_name 'employees'
set_primary_key :id
validate :id, :name, :email, :start_date, presence: true
validate :email, uniqueness: true
validate { errors.add(:email, "Expected TODO") unless email =~ /.*@example.com/ }
end
Reactive record does not currently attempt to generate any kind of reasonable error message (I'm working on it) :)
Enjoy
Firstly, thank you, contributors!
Also a special thanks to Joe Nelson, @begriffs, for contributions and inspiration; Reactive Record would not exist without his efforts. Thanks to Bendyworks for the 20% time to work on this project!
And, of course, a huge thank you to Kelly Rauwerdink for her amazing ability to make "an art" even when all I can do is sorta half-articulate what I'm talking about. Thanks!