Skip to content
This repository has been archived by the owner on Mar 8, 2021. It is now read-only.

RedHill on Rails Core is a plugin that features to support other RedHill on Rails plugins.

License

Notifications You must be signed in to change notification settings

samsung-ads-grave-yard/redhillonrails_core

 
 

Repository files navigation

Credits

This plugin was created by harukizaemon(github.com/harukizaemon) but is not supported currently by him. I’ve forked it to make it edge-rails compatible and to introduce new features.

RedHill on Rails Core

RedHill on Rails Core provides bunch of useful database features:

  • Creating and dropping views;

  • Creating and removing foreign-keys;

  • Creating partial indexes (postgresql only)

  • Obtaining indexes directly from a model class; and

  • Determining when Schema.define() is running.

Installation

As a gem

gem install redhillonrails_core

…or as a plugin

script/plugin install http://github.com/mlomnicki/redhillonrails_core.git

View Support

The plugin provides a mechanism for creating and dropping views as well as preserving views when performing a schema dump:

create_view :normal_customers, "SELECT * FROM customers WHERE status = 'normal'"
drop_view :normal_customers

Foreign Key Support

The plugin provides two mechanisms for adding foreign keys as well as preserving foreign keys when performing a schema dump. (Using SQL-92 syntax and as such should be compatible with most databases that support foreign-key constraints.)

The first mechanism for creating foreign-keys allows you to add a foreign key when defining a table. For example:

create_table :orders do |t|
  ...
  t.foreign_key :customer_id, :customers, :id
end

You also have the option of specifying what to do on delete/update using :on_delete/:on_update, respectively to one of: :cascade; :restrict; and :set_null:

create_table :orders do |t|
  ...
  t.foreign_key :customer_id, :customers, :id, :on_delete => :set_null, :on_update => :cascade
end

The second method allows you to create arbitrary foreign-keys at any time:

add_foreign_key(:orders, :customer_id, :customers, :id, :on_delete => :set_null, :on_update => :cascade)

In either case, if your database supports deferred foreign keys (for example PostgreSQL) you can specify this as well:

t.foreign_key :customer_id, :customers, :id, :deferrable => true
add_foreign_key(:orders, :customer_id, :customers, :id, :deferrable => true)

By default, the foreign key will be assigned a name by the underlying database. However, if this doesn’t suit your needs, you can override the default assignment using the :name option:

add_foreign_key(:orders, :customer_id, :customers, :id, :on_delete => :set_null, :on_update => :cascade, <strong>:name => :orders_customer_id_foreign_key<strong>)

You can also query the foreign keys for a model yourself by calling foreign_keys():

Order.foreign_keys

Or for an arbitrary table by calling foreign_keys(table_name) on a database adapter.

Either method returns an array of the following meta-data:

  • name - The name of the foreign key constraint;

  • table_name - The table for which the foreign-key was generated;

  • column_names - The column names in the table;

  • references_table_name - The table referenced by the foreign-key; and

  • references_column_names - The columns names in the referenced table.

If you need to drop a foreign-key, use:

remove_foreign_key :orders, :orders_ordered_by_id_fkey

The plugin also ensures that all foreign keys are output when performing a schema dump. This happens automatically when running rake migrate or rake db:schema:dump. This has particular implications when running unit tests that contain fixtures. To ensure the test data is correctly reset after each test, you should list your fixtures in order of parent->child. For example:

fixtures :customers, :products, :orders, :order_lines

Rails will then set-up and tear-down the fixtures in the correct sequence.

Some databases (PostgreSQL and MySQL for example) allow you to set a comment for a table. You can do this for existing tables by using:

set_table_comment :orders, "All pending and processed orders"

or even at the time of creation:

create_table :orders, :comment => "All pending and processed orders" do |t|
  ...
end

You can clear table comments using:

clear_table_comment :orders

There is also a rake tasks to show all database tables and their comments:

rake db:comments

The plugin fully supports and understands the following active-record configuration properties:

  • config.active_record.pluralize_table_names

  • config.active_record.table_name_prefix

  • config.active_record.table_name_suffix

Model Indexes

ActiveRecord::Base already provides a method on connection for obtaining the indexes for a given table. This plugin now makes it possible to obtain the indexes for a given model–ActiveRecord::Base–class. For example:

Invoice.indexes

Would return all the indexes for the invoices table.

Partial Indexes (indexes with conditions)

Partial indexes index only a portion of the database. Only PostgreSQL supports this feature.

add_index :users, :username, :unique => true, :conditions => {:state => "active"}

Indexing using an arbitrary expression (PostgreSQL only)

Create expression-based indexes:

add_index :users, [:first_name, :last_name], :expression => 'LOWER(first_name || last_name)'
add_index :places, :expression => '(sin(lat) * cos(lng))', :name => 'index_places_on_something'
add_index :documents, :body, :expression => "USING gin (to_tsvector('english', body))"

Expression is a pass-through: no quoting, escaping is done on it. Presumably, this expression is part of migrations, or at least, code under your control.

Case-insensitive Indexes

For PostgreSQL, you can add an option :case_sensitive => false to add_index which will generate an expression index of the form:

LOWER(column_name)

This means finder queries of the form:

WHERE LOWER(column_name) = LOWER(?)

are able to use the indexes rather require, in the worst case, full-table scans.

Note also that this ties in well with Rails built-in support for case-insensitive searching:

validates_uniqueness_of :name, :case_sensitive => false

Schema Defining

The plugin also adds a method–defining?()–to ActiveRecord::Schema to indicate when define() is running. This is necessary as some migration plugins must change their behaviour accordingly.

Examples

redhillonrails_core uses Micronaut for specing. The examples are split per-database adapter. Run using Bundler:

$ bundle install
$ bundle exec rake postgresql:examples

Running examples only will fail since the environment won’t be setup properly.

Contributors

About

RedHill on Rails Core is a plugin that features to support other RedHill on Rails plugins.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Ruby 100.0%