2015-06-22 162 views
1

我有一個名爲Tweet的模型。 Tweet模型的列爲:堆棧級別太深,因爲遞歸

-id 
-content 
-user_id 
-picture 
-group 
-original_tweet_id  

每條推文可以有一個或多個轉推。這種關係發生在original_tweet_id的幫助下。所有的推文都有original_tweet_id零,而轉推包含Tweet的ID。
當推文被刪除時,推特也必須被刪除。我嘗試這樣做的以下功能:

def destroy_retweets(tweet) 
    retweets = Tweet.where(original_tweet_id: @tweet.id) 
    if retweets.any? 
     retweets.each do |retweet| 
     destroy_retweets(retweet) 
     retweet.destroy 
     end 
    end 
    end 

如果我不加行"destroy_retweets(retweet)"那麼它的一切OK,並刪除鳴叫的銳推。問題是,當我轉發轉發時,這就是爲什麼我必須添加該行(所以我刪除所有轉推的轉推等)。由於這不能解決我如何使其工作或替代(除非不允許用戶轉推轉發)。

至於建議,這是tweet.rb型號:

class Tweet < ActiveRecord::Base 
    belongs_to :user 
    has_many :hashrelations, dependent: :destroy 
    has_many :hashtags, through: :hashrelations 
    default_scope -> { order(created_at: :desc) } 
    mount_uploader :picture, PictureUploader 
    validates :user_id, presence: true 
    validates :content, presence: true, length: { maximum: 140 } 
    validate :picture_size 


    private 

    # Validates the size of an uploaded picture. 
    def picture_size 
     if picture.size > 5.megabytes 
     errors.add(:picture, "o poza nu poate sa aiba o marime mai mare de 5MB") 
     end 
    end 

end 

這是第一次調用destroy_retweets方法:

def destroy 
    destroy_retweets(@tweet) 
    @tweet.destroy 
    redirect_to request.referrer || root_url 
    end 
+1

爲什麼要使用一個實例變量?由於每個方法調用都將覆蓋'@ retweets',所以這將解決問題。這可能不是根本原因,但它令我感到懷疑。 –

+0

我改變@retweets retweets和我仍然得到堆棧層面太深:P –

+0

我解決了問題,我寫@ tweet.id而不是tweet.id在where子句我的上帝愚蠢的我。無論如何,這是一個很好的問題,你非常戴夫牛頓和Avdept :)我從你身上學到了一些東西 –

回答

2

如果正確表達的關係,ActiveRecord的會爲你做它

class Tweet 
    belongs_to :original_tweet, class_name: Tweet 
    has_many :retweets, class_name: Tweet, dependent: :destroy, inverse_of :original_tweet 

end 

Tweet.last.destroy # will now destroy dependents 
+0

非常感謝:)。但是這段代碼是寫在我的Rails開始的,我必須改變很多才能做到這一點。但是,這是應該如何做!這是毫無疑問的最佳解決方案。 –

1

即使收集emtpy,則返回true反正。 而不是 if @retweets,使用if @retrweets.any?

爲什麼? 因爲where查詢返回ActiveRecord::Relation對象,並且您檢查是否存在對象,如果有任何記錄存在。

+0

是的,但它也不會遍歷空集合。 –

+0

好的。但我仍然得到它...... –

+0

你的模型中有回調嗎?你的tweet模型關係是什麼? – Avdept