我有一个名为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
答案 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
对象,并且您检查对象是否存在,而不是是否存在任何记录。