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(刪除連接記錄,不運行回調)。
- 我怎麼能有默認的策略,實際使用?如果我離開:完全依賴,則根本沒有記錄被刪除。我不能僅僅表明:依賴於has_many關係。 Rails回來並說:「依賴選項需要:destroy,:delete_all,:nullify或:restrict({})」。
- 如果我不指定:依賴於任何關係的,它不壞的PostsTag對象上POST_ID,因爲它似乎暗示
也許我讀這個錯誤,而我發現這種方法作品是正確的方式?
如果標籤被多個帖子使用會發生什麼?如果一個帖子被刪除,其他帖子將受到影響。 –
爲true,並且標籤應該有'has_many:posts,通過::posts_tags'不是帖子,我會使用'has_many:posts_tags,dependent :: destroy'來刪除posts_tag並保留標籤。您可以使用rake任務或控制檯刪除孤立標籤。 – rmagnum2002
修復了關聯,謝謝。我只是想了解文檔。措辭令人困惑 – Brian