Cả hai mô hình quan hệ nhiều-nhiều, khác nhau ở chỗ có model trung gian hay không:
has_and_belongs_to_many(HABTM): chỉ cần một bảng nối (vdauthors_books), không có model cho nó. Gọn khi quan hệ thuần túy là "nối", không có dữ liệu kèm theo.has_many :through: đi qua một model join thật (vdAuthorship). Model này có thể mang cột riêng, validations, callbacks, và bạn thao tác trực tiếp với nó.
ruby
# through: bảng nối là model thật, có thêm thuộc tính
class Authorship < ApplicationRecord
belongs_to :author
belongs_to :book
# cột riêng: role, royalty_percent...
end
class Author < ApplicationRecord
has_many :authorships
has_many :books, through: :authorships
endChọn thế nào: cần thuộc tính trên quan hệ, hoặc muốn validate/hook trên bản ghi nối → has_many :through.
Rails Guides khuyên mặc định ưu tiên through vì linh hoạt hơn; chỉ dùng HABTM khi chắc chắn không bao giờ cần làm việc trực tiếp với bảng nối.