請檢查我對遞歸破壞如何工作的理解?Rails破壞不調用destroy函數的依賴關係?
我有一個博客對象,其中包含大量的職位。帖子繼續有每次創建帖子時創建的新聞源對象。當我刪除博客時,帖子被刪除,但帖子上的新聞源對象沒有被刪除,留下了'鬼'新聞源對象。
模型> blog.rb
class Blog < ActiveRecord::Base
attr_accessible :description, :title, :user_id, :cover
belongs_to :user
has_many :posts, :dependent => :destroy
end
模型> post.rb
class Post < ActiveRecord::Base
attr_accessible :blog_id, :content_1, :type, :user_id, :media, :picture, :event_id
belongs_to :blog
belongs_to :user
end
所以,當我要求博客被摧毀,它拿起所有的職位,並摧毀他們。那很棒!但是我在post控制器的destroy函數中有一段特殊的自定義代碼,它要求自定義銷燬新進程。這不被稱爲。
控制器> post_controller.rb
def destroy
@post = Post.find(params[:id])
# Delete Feed on the creation of the post
if Feed.exists?(:content1 => 'newpost', :content2 => params[:id])
@feeds = Feed.where(:content1 => 'newpost', :content2 => params[:id])
@feeds.each do |feed|
feed.destroy
end
end
@post.destroy
respond_to do |format|
format.html { redirect_to redirect }
format.json { head :no_content }
end
end
的代碼在後的破壞功能該位不會被調用,所以資訊供稿對象不被破壞。我對依賴性破壞功能的理解是否錯誤?
我特別想避免在newsfeeds和post對象之間創建belongs_to和has_many關係,因爲newsfeed對象是由其他類型的用戶操作觸發的,例如爲某個新朋友加油,或者創建一個新的博客, newsfeed它在content1變量中。
我確實認爲這會起作用,但對於rails的dependent => destroy功能的性質我有點困惑。 當博客使用此依賴關係銷燬屬於它的所有帖子時,它是否不調用位於帖子控制器中的銷燬功能?如果不是,那麼delete_all和destroy之間有什麼區別? 唯一的區別是,與銷燬,我打電話花式功能像before_destroy? – ays0110
從控制器調用函數的唯一功能是來自用戶的傳入請求。控制器按照routes.rb的指示響應這些HTTP請求。它們實際上只是爲了處理客戶端和服務器之間的通信。真的,任何不涉及這種通信的處理(例如讀取/解析實體,傳遞錯誤消息,響應請求)都不應該放在控制器中,而應該是模型或幫助器(恕我直言)。 – GoGoCarl
因此,調用順序 - 客戶端向/ posts/1發出DELETE請求,controller#destroy方法處理此請求,並在Post模型(由ActiveRecord提供的方法)上調用destroy方法。由dependent指定的destroy調用不會通過控制器進行路由,而是直接轉到關聯的模型(再次通過提供的ActiveRecord方法)。希望這是有道理的。以下是控制器,模型和視圖所扮演角色的更多細節:http:// betterexplained。com/articles/intermediate-rails-understanding-models-views-and-controllers/ – GoGoCarl