# Active Record Associations
1. **One-to-One Relationship**
A one-to-one association exists when one record in a model is related to only one record in another model.
Example: If a user has a single profile:
A User has one Profile, and a Profile belongs to a User.
```ruby=
class User < ApplicationRecord
has_one :profile
end
class Profile < ApplicationRecord
belongs_to :user
end
```
```
rails generate model User name:string email:string
rails generate model Profile image:text user:references
```
2. One-to-Many Relationship
```ruby=
class School < ApplicationRecord
has_many :students
end
class Student < ApplicationRecord
belongs_to :school
end
```
3. Many-to-Many Relationship
In a many-to-many relationship, multiple records in one model can be associated with multiple records in another model.
Example: A Project can have many Developers, and a Developer can work on many Projects. This is usually achieved using a join table.
```ruby=
rails generate model Developer name:string
rails generate model Project title:string
rails generate model DeveloperProject developer:references project:references
```
```ruby=
class Developer < ApplicationRecord
has_many :developer_projects
has_many :projects, through: :developer_projects
end
class DeveloperProject < ApplicationRecord
belongs_to :developer
belongs_to :project
end
class Project < ApplicationRecord
has_many :developer_projects
has_many :developers, through: :developer_projects
end
```
## Special Associations
A polymorphic association allows a model to belong to more than one other model on a single association.
Example: A Comment can belong to both a Post and a Photo.
```ruby=
rails generate model Comment body:text commentable:references{polymorphic}
rails generate model Post title:string
rails generate model Photo title:string
```
```ruby=
class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
end
class Post < ApplicationRecord
has_many :comments, as: :commentable
end
class Photo < ApplicationRecord
has_many :comments, as: :commentable
end
```
### Types of Associations
**belongs_to** Indicates a relationship where the model contains the foreign key.
**has_one**: Specifies that a model has one of something.
**has_many**: Specifies that a model has many related records.
**has_many through**: Specifies a many-to-many relationship using a join table.
**has_one through**: Allows a one-to-one relationship through another model.
**has_and_belongs_to_many**: Used for many-to-many relationships without a separate join model.