2013-06-05 24 views
12
class Post < ActiveRecord::Base 
    has_many :posts_tags 
    has_many :tags, through: :posts_tags 
end 

class PostsTag < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :tag 
end 

class Tag < ActiveRecord::Base 
    has_many :posts_tags 
    has_many :posts, through: :posts_tags 
end 

Khi bài đăng bị hủy, tôi cũng muốn tất cả các liên kết của nó được gắn thẻ cũng bị xóa. Tôi KHÔNG muốn xác thực mô hình PostsTag để chạy. Tôi chỉ muốn xóa.Cách thích hợp để xóa has_many: thông qua hồ sơ tham gia?

Tôi nhận thấy rằng việc thêm người phụ thuộc vào mối quan hệ để đăng thẻ từ mô hình Đăng hoạt động như tôi muốn: has_many :posts_tags, dependent: :delete_all.

Tuy nhiên, tài liệu về chủ đề dường như gợi ý rằng tôi nên thực hiện việc này thay thế: has_many :tags, through: :posts_tags, dependent: :delete_all. Khi tôi làm điều này, đối tượng Thẻ bị hủy và đối tượng nối vẫn còn.

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

Đối has_many, phá hủy sẽ luôn luôn gọi phá hủy phương pháp của hồ sơ (s) đang được gỡ bỏ để callbacks đang chạy. Tuy nhiên, xóa sẽ thực hiện xóa theo chiến lược được chỉ định bởi tùy chọn: phụ thuộc, hoặc nếu không: tùy chọn phụ thuộc được đưa ra, thì nó sẽ thực hiện theo chiến lược mặc định. Chiến lược mặc định là: nullify (đặt các khóa ngoài thành 0), ngoại trừ has_many: thông qua, trong đó chiến lược mặc định là delete_all (xóa các bản ghi kết nối, mà không cần chạy callback của chúng).

  1. Làm cách nào để sử dụng chiến lược mặc định? Nếu tôi rời đi: phụ thuộc hoàn toàn, không có hồ sơ nào được xóa bỏ. Và tôi không thể chỉ ra: phụ thuộc vào mối quan hệ has_many. Rails quay trở lại và nói "Tùy chọn: phụ thuộc mong muốn: hủy bỏ,: delete_all,: nullify hoặc: limits ({})".
  2. Nếu tôi không chỉ định: phụ thuộc vào một trong các mối quan hệ, nó không vô hiệu hóa những post_id trên đối tượng PostsTag vì nó dường như cho thấy

Có lẽ tôi đang đọc bài viết này sai và phương pháp mà tôi thấy công trình là cách chính xác?

+1

Điều gì sẽ xảy ra nếu Thẻ được nhiều bài đăng sử dụng? Nếu một Bài đăng bị xóa, các Bài đăng khác sẽ bị ảnh hưởng. –

+0

đúng và Thẻ phải có 'has_many: bài đăng, thông qua:: posts_tags' không phải bài đăng, tôi sẽ sử dụng' has_many: posts_tags, phụ thuộc:: destroy' để xóa posts_tag và chỉ để thẻ một mình. Bạn có thể xóa các thẻ mồ côi bằng một tác vụ hoặc bàn điều khiển cào. – rmagnum2002

+0

Cố định liên kết, cảm ơn. Tôi chỉ đang cố hiểu tài liệu.Các từ ngữ là khó hiểu – Brian

Trả lời

17

ý tưởng ban đầu của bạn về:

has_many :posts_tags, dependent: :delete_all 

là chính xác những gì bạn muốn. Bạn làm không phải muốn khai báo điều này trên liên kết có nhiều mặc dù là :tags, vì điều đó sẽ hủy tất cả các Thẻ được liên kết. Điều bạn muốn xóa chính là liên kết - đó là những gì mà mô hình tham gia PostTag đại diện.

Vậy tại sao tài liệu lại nói những gì họ làm? Bạn hiểu nhầm trường hợp tài liệu mô tả:

Post.find(1).destroy 
Post.find(1).tags.delete 

Cuộc gọi đầu tiên (kịch bản của bạn) sẽ đơn giản phá hủy Bài đăng. Tức là, trừ khi bạn chỉ định một chiến lược :dependent, như tôi đề nghị bạn làm. Cuộc gọi thứ hai là những gì tài liệu mô tả. Gọi .tags.delete sẽ không (theo mặc định) thực sự phá hủy các thẻ (vì chúng được nối với nhau qua nhiều lần), nhưng mô hình kết hợp liên kết tham gia các thẻ này.

+0

ahh cảm ơn mà làm cho ý nghĩa hơn nhiều – Brian

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