Active Record Associations
Bài đăng này đã không được cập nhật trong 3 năm
Source: http://guides.rubyonrails.org/association_basics.html
Sau bài viết này bạn sẽ biết:
- Làm thế nào để khai báo mối quan hệ giữa các Active Record models.
- Giữa các Active Record cóc các kiểu quan hệ nào.
1 Why Associations?
Tại sao chúng ta cần liên kết giữa các model ? Vì chúng làm cho thao tác chung đơn giản hơn và dễ dàng hơn khi bạn viết code. Ví dụ, chúng ta có một ứng dụng Rails đơn giản bao gồm 2 model Customers và Order. Mỗi customer có thể có nhiều orders. Nếu không có associations, 2 model được khai báo như sau:
class Customer < ActiveRecord::Base
end
class Order < ActiveRecord::Base
end
Bây giờ, nếu ta muốn thêm 1 order mới cho customer đã tồn tại. Code của mình sẽ trông như này:
@order = Order.create(order_date: Time.now, customer_id: @customer.id)
Hoặc nếu bạn muốn xóa 1 customer, bạn phải đảm bảo rằng tất cả các orders của customer đó cũng phải được xóa bỏ.
@orders = Order.where(customer_id: @customer.id)
@orders.each do |order|
order.destroy
end
@customer.destroy
Với Active Record associations, ta có thể làm đơn giản hơn các thao tác này bằng cách khai báo mối quan hệ giữa các models. Chúng ta khai báo associations như sau:
class Customer < ActiveRecord::Base
has_many :orders, dependent: :destroy
end
class Order < ActiveRecord::Base
belongs_to :customer
end
Khi thêm associations, ta có cách đơn giản hơn để thêm một order cho customer:
@order = @customer.orders.create(order_date: Time.now)
Xóa một customer và tất cả các order của nó cũng đơn giản hơn:
@customer.destroy
Tiếp theo chúng ta sẽ tìm hiểu về các kiểu associations trong Rails.
2 The Types of Associations
Rails hỗ trợ 6 kiểu associations:
- belongs_to
- has_one
- has_many
- has_many :through
- has_one :through
- has_and_belongs_to_many Trong bài viết mình sẽ giới thiệu về belongs_to, has_one, has_many.
2.1 The belongs_to Association
Sử dụng belongs_to để thiết lập liên kết one-to-one với một model khác. Ví dụ, ứng dụng của bạn bao gồm customers và orders, và mỗi order có thể giao cho chính xác một customer, bạn sẽ khai báo model order bằng cách:
class Customers < ActiveRecord::Base
end
class Order < ActiveRecord::Base
belongs_to :customer
end
Cách viết belongs_to định nghĩa ở trên có nghĩa : các order thuộc duy nhất 1 customer. Giờ ta có thể sử dụng các method sau:
Order.first.customer
Bây giờ ta sẽ bổ xung thêm điều kiện:
- 2.2 1 customer chỉ có 1 order
- 2.3 1 customer có nhiều orders
Tương ứng với 2 điều kiện trên, ta có has_one và has_many.
2.2 The has_one Association
Mối quan hệ has_one cũng thiết lập mối quan hệ one-to-one với model khác, nhưng với ý nghĩa hơi khác. Là mỗi instance của model chỉ chứa hoặc sở hữu một instance của model khác. Khai báo như sau:
class Customers < ActiveRecord::Base
has_one :order
end
2.3 The has_many Association
Mối quan hệ has_many thiết lập mối quan hệ ont-to-many với model khác. Mối quan hệ này thể hiện mỗi instance của model có chứa một hoặc nhiều instance của model khác. Ta khai báo như sau:
class Customers < ActiveRecord::Base
has_many :orders
end
Trên đây mình giới thiệu với các bạn về mối quan hệ giữa các ActiveRecord trong Rails, tất nhiên vẫn còn nhiều thiếu sót và hạn chế, hy vọng giúp ích phần nào và các bạn tiếp cận Rails dễ dàng hơn.
Thank for reading!
All rights reserved