Association trong rails - Part 1
Association là cách để tạo ra liên kết giữa 2 model với nhau. belongs_to has_one has_many has_many :through has_one :through has_and_belongs_to_many 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) One-to-one (một-một) : 1 - 1 Ví dụ ta có ...
Association là cách để tạo ra liên kết giữa 2 model với nhau.
belongs_to has_one has_many has_many :through has_one :through has_and_belongs_to_many
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)
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