我有一個名爲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 :)我從你身上學到了一些東西 –