堆栈级别太深,因为递归

时间:2015-06-22 14:15:53

标签: ruby-on-rails ruby ruby-on-rails-4 twitter

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

Expression<Action<string>>

每条推文都可以有一个或多个转推。这种关系在-id -content -user_id -picture -group -original_tweet_id 的帮助下发生。所有推文都有original_tweet_id为零,而转推包含推文的ID  删除推文后,还必须删除转推。我尝试在以下函数中执行此操作:

original_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 行,那么一切正常,它会删除推文的转推。问题是当我转发转推时,这就是为什么我必须添加该行(所以我删除所有转推的转发等等)。因为这并不能解决我如何使其工作或替代(除了不允许用户转发转发)。

正如所建议的那样,这是tweet.rb模型:

"destroy_retweets(retweet)"

这是首先调用destroy_retweets的方法:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

即使收集emtpy,它仍然会返回true。 代替 if @retweets,使用if @retrweets.any?

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