Association trong rails - Part 1
Bài đăng này đã không được cập nhật trong 7 năm
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
All rights reserved