2015-06-22 122 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