1

請檢查我對遞歸破壞如何工作的理解?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變量中。

回答

2

我建議自定義源缺失代碼移入後你的模型像做:

class Post 
    before_destroy :cleanup 

    def cleanup 
    # Delete Feed on the creation of the post 
    if Feed.exists?(:content1 => 'newpost', :content2 => id) 
     @feeds = Feed.where(:content1 => 'newpost', :content2 => id) 
     @feeds.each do |feed| 
     feed.destroy 
     end 
    end 
    end 
end 

現在,如果@feeds是空的,那麼它可能是一個問題的存在?功能。但是,將此代碼移至此回調函數將確保隨時發佈帖子,相關的Feed將被刪除。

在你的控制器中,正常情況下調用@ post.destroy,剩下的就會自行處理。

+0

我確實認爲這會起作用,但對於rails的dependent => destroy功能的性質我有點困惑。 當博客使用此依賴關係銷燬屬於它的所有帖子時,它是否不調用位於帖子控制器中的銷燬功能?如果不是,那麼delete_all和destroy之間有什麼區別? 唯一的區別是,與銷燬,我打電話花式功能像before_destroy? – ays0110

+0

從控制器調用函數的唯一功能是來自用戶的傳入請求。控制器按照routes.rb的指示響應這些HTTP請求。它們實際上只是爲了處理客戶端和服務器之間的通信。真的,任何不涉及這種通信的處理(例如讀取/解析實體,傳遞錯誤消息,響應請求)都不應該放在控制器中,而應該是模型或幫助器(恕我直言)。 – GoGoCarl

+1

因此,調用順序 - 客戶端向/ posts/1發出DELETE請求,controller#destroy方法處理此請求,並在Post模型(由ActiveRecord提供的方法)上調用destroy方法。由dependent指定的destroy調用不會通過控制器進行路由,而是直接轉到關聯的模型(再次通過提供的ActiveRecord方法)。希望這是有道理的。以下是控制器,模型和視圖所扮演角色的更多細節:http:// betterexplained。com/articles/intermediate-rails-understanding-models-views-and-controllers/ – GoGoCarl