堆栈级别太深,因为递归

Stack level too deep because recursion

我有一个名为 Tweet 的模型。 Tweet 模型的列是:

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

每条推文都可以有一个或多个转推。这种关系是在 original_tweet_id 的帮助下发生的。所有推文都有 original_tweet_id nil ,而转推包含推文的 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)" 那么一切正常,它会删除推文的转发。问题是当我有转推的转推时,这就是为什么我必须添加该行(所以我删除了所有转推的转推等等)。由于这不起作用任何想法如何让它工作或替代(除了不允许用户转推转推)。

根据建议,这是 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

即使集合为空,它 returns 仍然是真的。 代替 if @retweets,使用if @retrweets.any?

为什么? 因为 where 查询 returns ActiveRecord::Relation 对象,并且您检查对象是否存在,而不是是否存在任何记录。

如果你正确表达关系,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