我有一个名为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
为什么要使用一个实例变量?由于每个方法调用都将覆盖'@ retweets',所以这将解决问题。这可能不是根本原因,但它令我感到怀疑。 –
我改变@retweets retweets和我仍然得到堆栈层面太深:P –
我解决了问题,我写@ tweet.id而不是tweet.id在where子句我的上帝愚蠢的我。无论如何,这是一个很好的问题,你非常戴夫牛顿和Avdept :)我从你身上学到了一些东西 –