Coder Social home page Coder Social logo

rmello / composite_primary_keys Goto Github PK

View Code? Open in Web Editor NEW

This project forked from composite-primary-keys/composite_primary_keys

0.0 1.0 1.0 1.9 MB

Composite Primary Keys support for Active Record

Ruby 84.70% HTML 1.95% JavaScript 12.40% CSS 0.94%

composite_primary_keys's Introduction

Composite Primary Keys for ActiveRecords

Summary

ActiveRecords infamously doesn’t support composite primary keys. This gem, composite_primary_keys, or CPK for short, extends ActiveRecord to support composite keys.

Installation

gem install composite_primary_keys

If you are using Rails add the following to your Gemfile:

gem 'composite_primary_keys', '=x.x.x' (see next section about what verison to use)

Versions

Every major version of ActiveRecord has included numerous internal changes. As a result, CPK has to be rewritten for each version of ActiveRecord. To help keep things straight, here is the mapping:

Version 8.x is designed to work with ActiveRecord 4.2.x
Version 7.x is designed to work with ActiveRecord 4.1.x
Version 6.x is designed to work with ActiveRecord 4.0.x
Version 5.x is designed to work with ActiveRecord 3.2.x
Version 4.x is designed to work with ActiveRecord 3.1.x

Run the following command to list available versions:

gem list composite_primary_keys -ra

The basics

A model with composite primary keys is defined like this:

class Membership < ActiveRecord::Base
  self.primary_keys = :user_id, :group_id
  belongs_to :user
  belongs_to :group
  has_many :statuses, :class_name => 'MembershipStatus', :foreign_key => [:user_id, :group_id]
end

Note the addition of the line:

self.primary_keys = :user_id, :group_id

A model associated with a composite key model is defined like this:

class MembershipStatus < ActiveRecord::Base
  belongs_to :membership, :foreign_key => [:user_id, :group_id]
end

That is, associations can include composite keys too. All Rails association types are supported. Nice.

Usage

Once you’ve created your models to specify composite primary keys (such as the Membership class) and associations (such as MembershipStatus#membership), you can uses them like any normal model with associations.

But first, lets check out our primary keys.

MembershipStatus.primary_key # => "id"    # normal single key
Membership.primary_key  # => [:user_id, :group_id] # composite keys
Membership.primary_key.to_s # => "user_id,group_id"

Now we want to be able to find instances using the same syntax we always use for ActiveRecords…

MembershipStatus.find(1)    # single id returns single instance
=> <MembershipStatus:0x392a8c8 @attributes={"id"=>"1", "status"=>"Active"}>
Membership.find([1,1])  # composite ids returns single instance
=> <Membership:0x39218b0 @attributes={"user_id"=>"1", "group_id"=>"1"}>

Notice the use of an array to specify the composite key values.

NOTE - API CHANGE. CPK Version 6.x and earlier used to allow composite keys to be listed out like this:

Membership.find(1,1)

This usage is no longer supported.

Databases

CPK supports the following databases:

* PostgreSQL
* MySQL
* MariaDB
* Oracle
* DB2
* SQLite
* SQLServer

Running Tests

See test/README_tests.rdoc

Questions, Discussion and Contributions

For help please visit github.com/composite-primary-keys/composite_primary_keys.

Author

First version was written by Dr Nic Williams.

Maintained by Charlie Savage

Contributions by many!

composite_primary_keys's People

Contributors

caboteria avatar ccabot avatar cfis avatar codeodor avatar darrinholst avatar dinshaw avatar drnic avatar drueck avatar elia avatar fmmfonseca avatar fx avatar isc avatar jmozmoz avatar jnv avatar jordanbyron avatar jpfuentes2 avatar justin808 avatar kirikak2 avatar kuroda avatar nddeluca avatar paxa avatar rcarver avatar rsutphin avatar seashell-qd avatar stackng avatar tekwiz avatar tism avatar tomhughes avatar tylerrick avatar zaldabus avatar

Watchers

 avatar

Forkers

somosdigital

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.