+1

Active Record Associations

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

belongs_to.png

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí