SlideShare a Scribd company logo
http://jy
aasa.comCopyright 2016. Jyaasa Technologies.
Association in
rails
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Associate Software Engineer at
Jyaasa Technologies
Hello !
I am Sarbada Nanda Jaiswal
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
What is the
association?
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
In Rails, an association is a connection between two
Active Record models.
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Why associations?
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Because they make common operations simpler and
easier in your code.
For example: Includes a model for authors and a
model for books. Each author can have many books.
The model declarations would look like:
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Without associations With Active Record associations
class Author < ApplicationRecord
end
class Book < ApplicationRecord
end
class Author < ApplicationRecord
has_many :books, dependent: :destroy
end
class Book < ApplicationRecord
belongs_to :author
end
@book = Book.create(published_at: Time.now,
author_id: @author.id)
@book = @author.books.create(published_at:
Time.now)
@books = Book.where(author_id: @author.id)
@books.each do |book|
book.destroy
end
@author.destroy
@author.destroy
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
The Types of Associations
Rails supports six types of associations:
● belongs_to
● has_one
● has_many
● has_many :through
● has_one :through
● has_and_belongs_to_many
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
The belongs_to Association
A one-to-one connection with another model.
Each instance of the declaring model "belongs to" one instance of
the other model.
For example, if your application includes authors and books, and
each book can be assigned to exactly one author then how would
be declared the book model?
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
class CreateBooks < ActiveRecord::Migration[5.0]
def change
create_table :authors do |t|
t.string :name
t.timestamps
end
create_table :books do |t|
t.belongs_to :author, index: true
t.datetime :published_at
t.timestamps
end
end
end
The corresponding migration might look like this:
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
The has_one Association
A one-to-one connection with another model.
Each instance of a model contains or possesses one
instance of another model.
For example, if each supplier in your application has only one
account. How would be declared the supplier model?
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
class CreateSuppliers <
ActiveRecord::Migration[5.0]
def change
create_table :suppliers do |t|
t.string :name
t.timestamps
end
create_table :accounts do |t|
t.belongs_to :supplier, index: true
t.string :account_number
t.timestamps
end
end
end
The corresponding migration might look like this:
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Depending on the use case, you might also need to create a unique index
and/or a foreign key constraint on the supplier column for the accounts table.
In this case, the column definition might look like this:
create_table :accounts do |t|
t.belongs_to :supplier, index: true, unique: true, foreign_key: true
# ...
end
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
The has_many Association
A one-to-many connection with another model.
This association on the "other side" of a belongs_to association.
Each instance of the model has zero or more instances of another
model.
The name of the other model is pluralized when declaring a has_many
association.
For example, in an application containing authors and books. How
would be the author model declared?
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
class CreateAuthors < ActiveRecord::Migration[5.0]
def change
create_table :authors do |t|
t.string :name
t.timestamps
end
create_table :books do |t|
t.belongs_to :author, index: true
t.datetime :published_at
t.timestamps
end
end
end
The corresponding migration might look like this:
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
The has_many :through Association
A many-to-many connection with another model.
The declaring model can be matched with zero or more instances of another
model by proceeding through a third model.
For example, consider a medical practice where patients make appointments to
see physicians. How should be relevant association declared?
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
class CreateAppointments < ActiveRecord::Migration[5.0]
def change
create_table :physicians do |t|
t.string :name
t.timestamps
end
create_table :patients do |t|
t.string :name
t.timestamps
end
create_table :appointments do |t|
t.belongs_to :physician, index: true
t.belongs_to :patient, index: true
t.datetime :appointment_date
t.timestamps
end
end
end
The corresponding migration might look like this:
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
physician.patients = patients
Automatic deletion of join models is direct, no destroy callbacks are
triggered.
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
The has_many :through association is also useful for setting up "shortcuts"
through nested has_many associations. For example, if a document has many
sections, and a section has many paragraphs, you may sometimes want to get
a simple collection of all paragraphs in the document. You could set that up this
way:
class Document < ApplicationRecord
has_many :sections
has_many :paragraphs, through: :sections
end
class Section < ApplicationRecord
belongs_to :document
has_many :paragraphs
end
class Paragraph < ApplicationRecord
belongs_to :section
end
@document.paragraphs
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
The has_one :through Association
A one-to-one connection with another model.
The declaring model can be matched with one instance of another model by
proceeding through a third model.
For example, if each supplier has one account, and each account is
associated with one account history. How should be the supplier model
could look like?
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
The corresponding migration might look like this:
class CreateAccountHistories < ActiveRecord::Migration[5.0]
def change
create_table :suppliers do |t|
t.string :name
t.timestamps
end
create_table :accounts do |t|
t.belongs_to :supplier, index: true
t.string :account_number
t.timestamps
end
create_table :account_histories do |t|
t.belongs_to :account, index: true
t.integer :credit_rating
t.timestamps
end
end
end
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
The has_and_belongs_to_many Association
A direct many-to-many connection with another model.
For example, if your application includes assemblies and parts, with each
assembly having many parts and each part appearing in many assemblies,
you could declare the models this way:
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
The corresponding migration might look like this:
class CreateAssembliesAndParts < ActiveRecord::Migration[5.0]
def change
create_table :assemblies do |t|
t.string :name
t.timestamps
end
create_table :parts do |t|
t.string :part_number
t.timestamps
end
create_table :assemblies_parts, id: false do |t|
t.belongs_to :assembly, index: true
t.belongs_to :part, index: true
end
end
end
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Choosing Between belongs_to and has_one
If you want to set up a one-to-one relationship between two models, you'll
need to add belongs_to one, and has_one to the other. How do you know
which is which?
The distinction is in where you place the foreign key (it goes on the table
for the class declaring the belongs_to association), but you should give
some thought to the actual meaning of the data as well. The has_one
relationship says that one of something is yours - that is, that something
points back to you. For example, it makes more sense to say that a
supplier owns an account than that an account owns a supplier. This
suggests that the correct relationships are like this:
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
class Supplier < ApplicationRecord
has_one :account
end
class Account < ApplicationRecord
belongs_to :supplier
end
class CreateSuppliers < ActiveRecord::Migration[5.0]
def change
create_table :suppliers do |t|
t.string :name
t.timestamps
end
create_table :accounts do |t|
t.integer :supplier_id
t.string :account_number
t.timestamps
end
add_index :accounts, :supplier_id
end
end
The corresponding migration might look like this:
Using t.integer :supplier_id
makes the foreign key naming
obvious and explicit. In current
versions of Rails, you can
abstract away this
implementation detail by using
t.references :supplier instead.
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Choosing Between has_many :through and has_and_belongs_to_many
Rails offers two different ways to declare a many-to-many relationship between
models. The simpler way is to use has_and_belongs_to_many, which allows
you to make the association directly:
class Assembly < ApplicationRecord
has_and_belongs_to_many :parts
end
class Part < ApplicationRecord
has_and_belongs_to_many :assemblies
end
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
The second way to declare a many-to-many relationship is to use
has_many :through. This makes the association indirectly, through a join
model:
class Assembly < ApplicationRecord
has_many :manifests
has_many :parts, through: :manifests
end
class Manifest < ApplicationRecord
belongs_to :assembly
belongs_to :part
end
class Part < ApplicationRecord
has_many :manifests
has_many :assemblies, through: :manifests
end
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
The simplest rule of thumb is that you should set up a has_many
:through relationship if you need to work with the relationship model as
an independent entity. If you don't need to do anything with the
relationship model, it may be simpler to set up a
has_and_belongs_to_many relationship (though you'll need to
remember to create the joining table in the database).
You should use has_many :through if you need validations, callbacks
or extra attributes on the join model.
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Polymorphic Associations
A slightly more advanced twist on associations is the polymorphic
association. With polymorphic associations, a model can belong to more
than one other model, on a single association. For example, you might
have a picture model that belongs to either an employee model or a
product model. Here's how this could be declared:
class Picture < ApplicationRecord
belongs_to :imageable, polymorphic: true
end
class Employee < ApplicationRecord
has_many :pictures, as: :imageable
end
class Product < ApplicationRecord
has_many :pictures, as: :imageable
end
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
You can think of a polymorphic belongs_to declaration as setting up an interface
that any other model can use. From an instance of the Employee model, you can
retrieve a collection of pictures: @employee.pictures.
Similarly, you can retrieve @product.pictures.
If you have an instance of the Picture model, you can get to its parent via
@picture.imageable. To make this work, you need to declare both a foreign key
column and a type column in the model that declares the polymorphic interface:
class CreatePictures < ActiveRecord::Migration[5.0]
def change
create_table :pictures do |t|
t.string :name
t.integer :imageable_id
t.string :imageable_type
t.timestamps
end
add_index :pictures, [:imageable_type,
:imageable_id]
end
end
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
This migration can be simplified by using the t.references form:
class CreatePictures < ActiveRecord::Migration[5.0]
def change
create_table :pictures do |t|
t.string :name
t.references :imageable, polymorphic: true, index: true
t.timestamps
end
end
end
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Self Joins
In designing a data model, you will sometimes find a model that should have
a relation to itself. For example, you may want to store all employees in a
single database model, but be able to trace relationships such as between
manager and subordinates. This situation can be modeled with self-joining
associations:
class Employee < ApplicationRecord
has_many :subordinates, class_name: "Employee",
foreign_key: "manager_id"
belongs_to :manager, class_name: "Employee"
end
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
With this setup, you can retrieve @employee.subordinates and
@employee.manager.
In your migrations/schema, you will add a references column to the model
itself.
class CreateEmployees < ActiveRecord::Migration[5.0]
def change
create_table :employees do |t|
t.references :manager, index: true
t.timestamps
end
end
end
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
Copyright 2016. Jyaasa Technologies.
http://jy
aasa.com
References
http://guides.rubyonrails.org/association_basics.html
Copyright 2015. Jyaasa Technologies.Copyright 2016. Jyaasa Technologies.
http://jyaasa.com

More Related Content

PPTX
Active Record PowerPoint
PPT
Aspirea sales presentation
PPTX
Adobe Business.pptx
PDF
How to Price Your Agency Services
PPTX
Zero to 100 - Part 5: SaaS Business Model & Metrics
PPTX
7 SEO Tips And Tricks - That Actually Work | SEO Tips 2019 | SEO Tutorial For...
DOCX
Affiliate marketing mastermind
PPTX
Jsp(java server pages)
Active Record PowerPoint
Aspirea sales presentation
Adobe Business.pptx
How to Price Your Agency Services
Zero to 100 - Part 5: SaaS Business Model & Metrics
7 SEO Tips And Tricks - That Actually Work | SEO Tips 2019 | SEO Tutorial For...
Affiliate marketing mastermind
Jsp(java server pages)

What's hot (20)

PPTX
Bessemer Venture Partners' 2019 State of the Cloud
PPTX
Microsoft Azure Batch
PPTX
Hannah Rampton: Getting started with Query in Google Sheets
PDF
AWS or Azure or Google Cloud | Best Cloud Platform | Cloud Platform Comparison
PPTX
Subdomain takeover
KEY
Object Oriented CSS
PDF
Spring Cloud Function: Where We Were, Where We Are, and Where We’re Going
PPTX
Webinar presentation on cloud computing
DOCX
Marketo Administration Instructions
DOCX
Cuestionario
PPTX
The Key Drivers for SaaS Success
PDF
Lean Analytics Cycle
PPT
CorelDRAW Aplicaciones
PDF
Google Cloud Platform
PPTX
Link Building Basics
PPTX
DRUPAL - caracteristicas
PPTX
On page SEO
PDF
Digital Marketing: The Game Changer for Businesses in a Post COVID-19 Economy
PDF
Ejercicio 2-kotlin-core
PPTX
Sistema de gestores de base de datos
Bessemer Venture Partners' 2019 State of the Cloud
Microsoft Azure Batch
Hannah Rampton: Getting started with Query in Google Sheets
AWS or Azure or Google Cloud | Best Cloud Platform | Cloud Platform Comparison
Subdomain takeover
Object Oriented CSS
Spring Cloud Function: Where We Were, Where We Are, and Where We’re Going
Webinar presentation on cloud computing
Marketo Administration Instructions
Cuestionario
The Key Drivers for SaaS Success
Lean Analytics Cycle
CorelDRAW Aplicaciones
Google Cloud Platform
Link Building Basics
DRUPAL - caracteristicas
On page SEO
Digital Marketing: The Game Changer for Businesses in a Post COVID-19 Economy
Ejercicio 2-kotlin-core
Sistema de gestores de base de datos
Ad

Viewers also liked (20)

PDF
Design Pattern:: Template Method
PDF
Factory Design Pattern
PDF
Scalable and Modular Architecture for CSS
PPTX
Rails engine
PPTX
BEVM ( block__element--variation -modifier)
PPTX
Design patterns: observer pattern
PPTX
Healthcare Office Pro - Complete Overview
PPT
Inf dan 2016 gradbeni tehnik 2016
PDF
europrog avanzato
PPTX
Vontade de deus
PDF
Letter of Recommendation 3
PPT
Poklici s področja gradbeništva
PPTX
Skupna predstavitev 2016
PPTX
Predstavitev informativni dan lesarski tehnik pti 2016
PPTX
HTML5 History
PPTX
Plain text for self organisation
PDF
Command Pattern in Ruby
PDF
Introduction of React.js
PPTX
Design Patern::Adaptor pattern
Design Pattern:: Template Method
Factory Design Pattern
Scalable and Modular Architecture for CSS
Rails engine
BEVM ( block__element--variation -modifier)
Design patterns: observer pattern
Healthcare Office Pro - Complete Overview
Inf dan 2016 gradbeni tehnik 2016
europrog avanzato
Vontade de deus
Letter of Recommendation 3
Poklici s področja gradbeništva
Skupna predstavitev 2016
Predstavitev informativni dan lesarski tehnik pti 2016
HTML5 History
Plain text for self organisation
Command Pattern in Ruby
Introduction of React.js
Design Patern::Adaptor pattern
Ad

Similar to Association in rails (20)

PPTX
Backward Compatibility Developer's Guide in Magento 2
PDF
Rupicon 2014 Single table inheritance
PDF
Barcelona Salesforce Admins Group (7-May-2019)
PDF
Just Enough HTML for Fatwire
PDF
Access tips access and sql part 6 dynamic reports
PPT
Ruby On Rails Siddhesh
DOCX
Cognos Online Training @ Adithya Elearning
DOCX
Ms flow basics, troubleshooting and operational errors
PPTX
Summer '16 Realease notes
PDF
ChircuVictor StefircaMadalin rad_aspmvc3_wcf_vs2010
PPTX
20160913_AlteryxPHX.PPTX
PPT
XAJA - Reverse AJAX framework
PPTX
Tableau free tutorial
PPTX
Northern New England Tableau User Group - September 2024 Meeting
DOCX
High performance coding practices code project
PPTX
DOCX
What is java script
PPT
Sas training in hyderabad
PPTX
Introduction to whats new in css3
PPT
The ActionScript Conference 08, Singapore - Developing ActionScript 3 Mash up...
Backward Compatibility Developer's Guide in Magento 2
Rupicon 2014 Single table inheritance
Barcelona Salesforce Admins Group (7-May-2019)
Just Enough HTML for Fatwire
Access tips access and sql part 6 dynamic reports
Ruby On Rails Siddhesh
Cognos Online Training @ Adithya Elearning
Ms flow basics, troubleshooting and operational errors
Summer '16 Realease notes
ChircuVictor StefircaMadalin rad_aspmvc3_wcf_vs2010
20160913_AlteryxPHX.PPTX
XAJA - Reverse AJAX framework
Tableau free tutorial
Northern New England Tableau User Group - September 2024 Meeting
High performance coding practices code project
What is java script
Sas training in hyderabad
Introduction to whats new in css3
The ActionScript Conference 08, Singapore - Developing ActionScript 3 Mash up...

More from Jyaasa Technologies (20)

PPTX
Incident management with jira
PPTX
Extreme programming practices ( xp )
PPTX
The myth of 'real javascript developer'
PPTX
Microservices
PPTX
Facade pattern in rails
PPTX
Scrum ceromonies
PPTX
An introduction to bitcoin
PPTX
Tor network
PPTX
Collective ownership in agile teams
PPTX
Push notification
PPTX
The Design Thinking Process
PPTX
PPTX
Design sprint
PPTX
Data Flow Diagram
PPTX
OKRs and Actions Overview
PPTX
Active record in rails 5
PDF
Web design layout pattern
PDF
Chain of responsibility
PDF
Strategy Design Pattern
Incident management with jira
Extreme programming practices ( xp )
The myth of 'real javascript developer'
Microservices
Facade pattern in rails
Scrum ceromonies
An introduction to bitcoin
Tor network
Collective ownership in agile teams
Push notification
The Design Thinking Process
Design sprint
Data Flow Diagram
OKRs and Actions Overview
Active record in rails 5
Web design layout pattern
Chain of responsibility
Strategy Design Pattern

Recently uploaded (20)

PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
KodekX | Application Modernization Development
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Empathic Computing: Creating Shared Understanding
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Electronic commerce courselecture one. Pdf
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
A Presentation on Artificial Intelligence
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Modernizing your data center with Dell and AMD
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Machine learning based COVID-19 study performance prediction
PDF
Encapsulation theory and applications.pdf
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
MYSQL Presentation for SQL database connectivity
Spectral efficient network and resource selection model in 5G networks
Diabetes mellitus diagnosis method based random forest with bat algorithm
KodekX | Application Modernization Development
Understanding_Digital_Forensics_Presentation.pptx
Empathic Computing: Creating Shared Understanding
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Electronic commerce courselecture one. Pdf
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
A Presentation on Artificial Intelligence
Mobile App Security Testing_ A Comprehensive Guide.pdf
“AI and Expert System Decision Support & Business Intelligence Systems”
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Modernizing your data center with Dell and AMD
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Machine learning based COVID-19 study performance prediction
Encapsulation theory and applications.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
MYSQL Presentation for SQL database connectivity

Association in rails

  • 1. http://jy aasa.comCopyright 2016. Jyaasa Technologies. Association in rails
  • 2. Copyright 2016. Jyaasa Technologies. http://jy aasa.com Associate Software Engineer at Jyaasa Technologies Hello ! I am Sarbada Nanda Jaiswal
  • 3. Copyright 2016. Jyaasa Technologies. http://jy aasa.com What is the association?
  • 4. Copyright 2016. Jyaasa Technologies. http://jy aasa.com In Rails, an association is a connection between two Active Record models.
  • 5. Copyright 2016. Jyaasa Technologies. http://jy aasa.com Why associations?
  • 6. Copyright 2016. Jyaasa Technologies. http://jy aasa.com Because they make common operations simpler and easier in your code. For example: Includes a model for authors and a model for books. Each author can have many books. The model declarations would look like:
  • 7. Copyright 2016. Jyaasa Technologies. http://jy aasa.com Without associations With Active Record associations class Author < ApplicationRecord end class Book < ApplicationRecord end class Author < ApplicationRecord has_many :books, dependent: :destroy end class Book < ApplicationRecord belongs_to :author end @book = Book.create(published_at: Time.now, author_id: @author.id) @book = @author.books.create(published_at: Time.now) @books = Book.where(author_id: @author.id) @books.each do |book| book.destroy end @author.destroy @author.destroy
  • 8. Copyright 2016. Jyaasa Technologies. http://jy aasa.com The Types of Associations Rails supports six types of associations: ● belongs_to ● has_one ● has_many ● has_many :through ● has_one :through ● has_and_belongs_to_many
  • 9. Copyright 2016. Jyaasa Technologies. http://jy aasa.com The belongs_to Association A one-to-one connection with another model. Each instance of the declaring model "belongs to" one instance of the other model. For example, if your application includes authors and books, and each book can be assigned to exactly one author then how would be declared the book model?
  • 10. Copyright 2016. Jyaasa Technologies. http://jy aasa.com
  • 11. Copyright 2016. Jyaasa Technologies. http://jy aasa.com class CreateBooks < ActiveRecord::Migration[5.0] def change create_table :authors do |t| t.string :name t.timestamps end create_table :books do |t| t.belongs_to :author, index: true t.datetime :published_at t.timestamps end end end The corresponding migration might look like this:
  • 12. Copyright 2016. Jyaasa Technologies. http://jy aasa.com The has_one Association A one-to-one connection with another model. Each instance of a model contains or possesses one instance of another model. For example, if each supplier in your application has only one account. How would be declared the supplier model?
  • 13. Copyright 2016. Jyaasa Technologies. http://jy aasa.com
  • 14. Copyright 2016. Jyaasa Technologies. http://jy aasa.com class CreateSuppliers < ActiveRecord::Migration[5.0] def change create_table :suppliers do |t| t.string :name t.timestamps end create_table :accounts do |t| t.belongs_to :supplier, index: true t.string :account_number t.timestamps end end end The corresponding migration might look like this:
  • 15. Copyright 2016. Jyaasa Technologies. http://jy aasa.com Depending on the use case, you might also need to create a unique index and/or a foreign key constraint on the supplier column for the accounts table. In this case, the column definition might look like this: create_table :accounts do |t| t.belongs_to :supplier, index: true, unique: true, foreign_key: true # ... end
  • 16. Copyright 2016. Jyaasa Technologies. http://jy aasa.com The has_many Association A one-to-many connection with another model. This association on the "other side" of a belongs_to association. Each instance of the model has zero or more instances of another model. The name of the other model is pluralized when declaring a has_many association. For example, in an application containing authors and books. How would be the author model declared?
  • 17. Copyright 2016. Jyaasa Technologies. http://jy aasa.com
  • 18. Copyright 2016. Jyaasa Technologies. http://jy aasa.com class CreateAuthors < ActiveRecord::Migration[5.0] def change create_table :authors do |t| t.string :name t.timestamps end create_table :books do |t| t.belongs_to :author, index: true t.datetime :published_at t.timestamps end end end The corresponding migration might look like this:
  • 19. Copyright 2016. Jyaasa Technologies. http://jy aasa.com The has_many :through Association A many-to-many connection with another model. The declaring model can be matched with zero or more instances of another model by proceeding through a third model. For example, consider a medical practice where patients make appointments to see physicians. How should be relevant association declared?
  • 20. Copyright 2016. Jyaasa Technologies. http://jy aasa.com
  • 21. Copyright 2016. Jyaasa Technologies. http://jy aasa.com class CreateAppointments < ActiveRecord::Migration[5.0] def change create_table :physicians do |t| t.string :name t.timestamps end create_table :patients do |t| t.string :name t.timestamps end create_table :appointments do |t| t.belongs_to :physician, index: true t.belongs_to :patient, index: true t.datetime :appointment_date t.timestamps end end end The corresponding migration might look like this:
  • 22. Copyright 2016. Jyaasa Technologies. http://jy aasa.com physician.patients = patients Automatic deletion of join models is direct, no destroy callbacks are triggered.
  • 23. Copyright 2016. Jyaasa Technologies. http://jy aasa.com The has_many :through association is also useful for setting up "shortcuts" through nested has_many associations. For example, if a document has many sections, and a section has many paragraphs, you may sometimes want to get a simple collection of all paragraphs in the document. You could set that up this way: class Document < ApplicationRecord has_many :sections has_many :paragraphs, through: :sections end class Section < ApplicationRecord belongs_to :document has_many :paragraphs end class Paragraph < ApplicationRecord belongs_to :section end @document.paragraphs
  • 24. Copyright 2016. Jyaasa Technologies. http://jy aasa.com The has_one :through Association A one-to-one connection with another model. The declaring model can be matched with one instance of another model by proceeding through a third model. For example, if each supplier has one account, and each account is associated with one account history. How should be the supplier model could look like?
  • 25. Copyright 2016. Jyaasa Technologies. http://jy aasa.com
  • 26. Copyright 2016. Jyaasa Technologies. http://jy aasa.com The corresponding migration might look like this: class CreateAccountHistories < ActiveRecord::Migration[5.0] def change create_table :suppliers do |t| t.string :name t.timestamps end create_table :accounts do |t| t.belongs_to :supplier, index: true t.string :account_number t.timestamps end create_table :account_histories do |t| t.belongs_to :account, index: true t.integer :credit_rating t.timestamps end end end
  • 27. Copyright 2016. Jyaasa Technologies. http://jy aasa.com The has_and_belongs_to_many Association A direct many-to-many connection with another model. For example, if your application includes assemblies and parts, with each assembly having many parts and each part appearing in many assemblies, you could declare the models this way:
  • 28. Copyright 2016. Jyaasa Technologies. http://jy aasa.com
  • 29. Copyright 2016. Jyaasa Technologies. http://jy aasa.com The corresponding migration might look like this: class CreateAssembliesAndParts < ActiveRecord::Migration[5.0] def change create_table :assemblies do |t| t.string :name t.timestamps end create_table :parts do |t| t.string :part_number t.timestamps end create_table :assemblies_parts, id: false do |t| t.belongs_to :assembly, index: true t.belongs_to :part, index: true end end end
  • 30. Copyright 2016. Jyaasa Technologies. http://jy aasa.com Choosing Between belongs_to and has_one If you want to set up a one-to-one relationship between two models, you'll need to add belongs_to one, and has_one to the other. How do you know which is which? The distinction is in where you place the foreign key (it goes on the table for the class declaring the belongs_to association), but you should give some thought to the actual meaning of the data as well. The has_one relationship says that one of something is yours - that is, that something points back to you. For example, it makes more sense to say that a supplier owns an account than that an account owns a supplier. This suggests that the correct relationships are like this:
  • 31. Copyright 2016. Jyaasa Technologies. http://jy aasa.com class Supplier < ApplicationRecord has_one :account end class Account < ApplicationRecord belongs_to :supplier end class CreateSuppliers < ActiveRecord::Migration[5.0] def change create_table :suppliers do |t| t.string :name t.timestamps end create_table :accounts do |t| t.integer :supplier_id t.string :account_number t.timestamps end add_index :accounts, :supplier_id end end The corresponding migration might look like this: Using t.integer :supplier_id makes the foreign key naming obvious and explicit. In current versions of Rails, you can abstract away this implementation detail by using t.references :supplier instead.
  • 32. Copyright 2016. Jyaasa Technologies. http://jy aasa.com Choosing Between has_many :through and has_and_belongs_to_many Rails offers two different ways to declare a many-to-many relationship between models. The simpler way is to use has_and_belongs_to_many, which allows you to make the association directly: class Assembly < ApplicationRecord has_and_belongs_to_many :parts end class Part < ApplicationRecord has_and_belongs_to_many :assemblies end
  • 33. Copyright 2016. Jyaasa Technologies. http://jy aasa.com The second way to declare a many-to-many relationship is to use has_many :through. This makes the association indirectly, through a join model: class Assembly < ApplicationRecord has_many :manifests has_many :parts, through: :manifests end class Manifest < ApplicationRecord belongs_to :assembly belongs_to :part end class Part < ApplicationRecord has_many :manifests has_many :assemblies, through: :manifests end
  • 34. Copyright 2016. Jyaasa Technologies. http://jy aasa.com The simplest rule of thumb is that you should set up a has_many :through relationship if you need to work with the relationship model as an independent entity. If you don't need to do anything with the relationship model, it may be simpler to set up a has_and_belongs_to_many relationship (though you'll need to remember to create the joining table in the database). You should use has_many :through if you need validations, callbacks or extra attributes on the join model.
  • 35. Copyright 2016. Jyaasa Technologies. http://jy aasa.com Polymorphic Associations A slightly more advanced twist on associations is the polymorphic association. With polymorphic associations, a model can belong to more than one other model, on a single association. For example, you might have a picture model that belongs to either an employee model or a product model. Here's how this could be declared: class Picture < ApplicationRecord belongs_to :imageable, polymorphic: true end class Employee < ApplicationRecord has_many :pictures, as: :imageable end class Product < ApplicationRecord has_many :pictures, as: :imageable end
  • 36. Copyright 2016. Jyaasa Technologies. http://jy aasa.com You can think of a polymorphic belongs_to declaration as setting up an interface that any other model can use. From an instance of the Employee model, you can retrieve a collection of pictures: @employee.pictures. Similarly, you can retrieve @product.pictures. If you have an instance of the Picture model, you can get to its parent via @picture.imageable. To make this work, you need to declare both a foreign key column and a type column in the model that declares the polymorphic interface: class CreatePictures < ActiveRecord::Migration[5.0] def change create_table :pictures do |t| t.string :name t.integer :imageable_id t.string :imageable_type t.timestamps end add_index :pictures, [:imageable_type, :imageable_id] end end
  • 37. Copyright 2016. Jyaasa Technologies. http://jy aasa.com This migration can be simplified by using the t.references form: class CreatePictures < ActiveRecord::Migration[5.0] def change create_table :pictures do |t| t.string :name t.references :imageable, polymorphic: true, index: true t.timestamps end end end
  • 38. Copyright 2016. Jyaasa Technologies. http://jy aasa.com
  • 39. Copyright 2016. Jyaasa Technologies. http://jy aasa.com Self Joins In designing a data model, you will sometimes find a model that should have a relation to itself. For example, you may want to store all employees in a single database model, but be able to trace relationships such as between manager and subordinates. This situation can be modeled with self-joining associations: class Employee < ApplicationRecord has_many :subordinates, class_name: "Employee", foreign_key: "manager_id" belongs_to :manager, class_name: "Employee" end
  • 40. Copyright 2016. Jyaasa Technologies. http://jy aasa.com With this setup, you can retrieve @employee.subordinates and @employee.manager. In your migrations/schema, you will add a references column to the model itself. class CreateEmployees < ActiveRecord::Migration[5.0] def change create_table :employees do |t| t.references :manager, index: true t.timestamps end end end
  • 41. Copyright 2016. Jyaasa Technologies. http://jy aasa.com
  • 42. Copyright 2016. Jyaasa Technologies. http://jy aasa.com References http://guides.rubyonrails.org/association_basics.html
  • 43. Copyright 2015. Jyaasa Technologies.Copyright 2016. Jyaasa Technologies. http://jyaasa.com