2012-01-24 25 views
16

tôi đã thiết lập mối quan hệ sau:Timestamps trên HABTM mối quan hệ với ActiveRecord

class Article < ActiveRecord::Base 
    has_and_belongs_to_many :authors 
end 

class Author < ActiveRecord::Base 
    has_and_belongs_to_many :articles 
end 

tôi nhận thấy rằng, mặc dù tham gia bảng articles_authors có timestamps, họ không cư khi tạo ra một mối quan hệ mới. Ví dụ:

Author.first.articles << Article.first 

Điều quan trọng là tôi theo dõi thời điểm tác giả được liên kết với một bài viết. Có cách nào để tôi có thể thực hiện việc này không?

Trả lời

14

Từ rails guides.

Nguyên tắc đơn giản của ngón tay cái là bạn nên thiết lập một has_many: thông qua mối quan hệ nếu bạn cần phải làm việc với mô hình mối quan hệ như một thực thể độc lập. Nếu bạn không cần làm bất kỳ điều gì với mô hình mối quan hệ, có thể đơn giản hơn để thiết lập mối quan hệ has_and_belongs_to_many (mặc dù bạn sẽ cần phải nhớ tạo bảng kết nối trong cơ sở dữ liệu).

Bạn nên sử dụng has_many: thông qua nếu bạn cần xác thực, gọi lại hoặc thêm thuộc tính trên mô hình tham gia.

class Article < ActiveRecord::Base 
    has_many :article_authors 
    has_many :authors, :through => :article_authors 
end 

class Author < ActiveRecord::Base 
    has_many :article_authors 
    has_many :articles, :through => :article_authors 
end 

class ArticleAuthor < ActiveRecord::Base 
    belongs_to :article 
    belongs_to :author 
end 

Nếu nó vẫn không hoạt động với cấu trúc đó, sau đó thay vì sử dụng một push mảng, sử dụng một tạo.

Author.first.article_authors.create(:article => Article.first) 
+3

Cảm ơn! Tạo một mô hình mối quan hệ riêng biệt hoạt động. Tôi không nghĩ rằng lưu trữ dấu thời gian là đủ để đảm bảo một mô hình riêng biệt. – deadkarma

+1

Điều này có nghĩa là bảng articles_authors cần được đổi tên thành article_authors không? –

+0

@TonyZito Đúng vậy. – Gazler

Các vấn đề liên quan