2013-06-05 86 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 

當Post被銷燬時,我希望它的所有關聯都被標記爲已刪除。我不想在PostsTag模型上運行驗證。我只想刪除。正確的方法來刪除has_many:通過連接記錄?

我發現在帖子模型中添加一個依賴於帖子標籤的關係,就像我想要的那樣:has_many :posts_tags, dependent: :delete_all

但是,有關該主題的文檔似乎表明我應該這樣做:has_many :tags, through: :posts_tags, dependent: :delete_all。當我這樣做時,Tag對象被銷燬並且連接對象保持不變。

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

有關的has_many,破壞總是會調用被去除,使得回調運行結果的破壞方法。但是刪除將根據依賴選項指定的策略執行刪除操作,或者如果沒有:依賴選項,則它將遵循默認策略。缺省策略是:nullify(將外鍵設置爲零),(has_many:through除外),默認策略是delete_all(刪除連接記錄,不運行回調)。

  1. 我怎麼能有默認的策略,實際使用?如果我離開:完全依賴,則根本沒有記錄被刪除。我不能僅僅表明:依賴於has_many關係。 Rails回來並說:「依賴選項需要:destroy,:delete_all,:nullify或:restrict({})」。
  2. 如果我不指定:依賴於任何關係的,它不壞的PostsTag對象上POST_ID,因爲它似乎暗示

也許我讀這個錯誤,而我發現這種方法作品是正確的方式?

+1

如果標籤被多個帖子使用會發生什麼?如果一個帖子被刪除,其他帖子將受到影響。 –

+0

爲true,並且標籤應該有'has_many:posts,通過::posts_tags'不是帖子,我會使用'has_many:posts_tags,dependent :: destroy'來刪除posts_tag並保留標籤。您可以使用rake任務或控制檯刪除孤立標籤。 – rmagnum2002

+0

修復了關聯,謝謝。我只是想了解文檔。措辭令人困惑 – Brian

回答

17

你的原來的想法:

has_many :posts_tags, dependent: :delete_all 

正是你想要的。你做不是想要在有很多雖然協會:tags宣佈這一點,因爲這將摧毀所有相關的標籤。你想要刪除的是關聯本身 - 這是PostTag聯接模型所代表的。

那麼爲什麼文檔說他們做什麼?你是誤解的情況,該文檔描述:

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

第一次調用(你的情況)只會破壞後。也就是說,除非你指定:dependent策略,正如我所建議的那樣。第二個調用是文檔描述的內容。調用.tags.delete不會(默認情況下)實際銷燬標記(因爲它們由has-many-through連接),而是關聯這些標記的關聯連接模型。

+0

啊,謝謝,這更有意義 – Brian

相關問題