Association trong rails - Part 1

1. Association là gì ?

Association là cách để tạo ra liên kết giữa 2 model với nhau.

2. Các loại association trong rails hỗ trợ.

belongs_to has_one has_many has_many :through has_one :through has_and_belongs_to_many

3. Các kiểu liên kết

One-to-one (một-một) One-to-many (một-nhiều) Many-to-many (nhiều-nhiều) Polymorphic (đa hình)

4. Cách tạo

One-to-one (một-một) : 1 - 1

Ví dụ ta có 2 bảng là users và accounts. Một user chỉ được có duy nhất 1 tài khoản và một tài khoản chỉ thuộc về 1 user nhất định, vậy để tạo association cho 2 model này, ta sẽ khai báo trong 2 model như sau:

# app/models/user.rb
class User < ApplicationRecord
  has_one :account
end
#app/models/account.rb
class Account < ApplicationRecord
  belongs_to :user
end

One-to-many (một-nhiều) : 1 - n

Ví dụ ta có 2 bảng là users và orders. Một user có thể có nhiều order và mỗi order chỉ thuộc về 1 user nào đó, vậy để tạo association cho 2 model này, ta sẽ khai báo trong 2 model như sau:

#app/models/user.rb
class User < ApplicationRecord
  has_many :orders
end
#app/models/order.rb
class Order < ApplicationRecord
  belongs_to :user
end

Many-to-many (nhiều-nhiều) : n - n

Ví dụ ta có 2 bảng là categories và products được nối với nhau qua bảng relations. Mỗi category có thể có nhiều product và mỗi product có thể có trong nhiều category. Cách 1 : dùng has_many :through

#app/models/relation.rb
class Relation < ApplicationRecord
 belongs_to :category
 belongs_to :product
end
#app/models/category.rb
class Category < ApplicationRecord
 has_many :relations
 has_many :products, through: :relations
end
#app/models/product.rb
class Product < ApplicationRecord
  has_many :relations
  has_many :categories, through: :relations
end

Cách 2 : dùng has_and_belongs_to_many Đây là kiểu quan hệ trực tiếp không có models trung gian

#app/models/category.rb
class Category < ApplicationRecord
  has_and_belongs_to_many :products
end
#app/models/product.rb
class Product < ApplicationRecord
  has_and_belongs_to_many :categories
end

Tài liệu tham khảo : http://guides.rubyonrails.org/association_basics.html