0

在保存 ActiveRecord 关联时遇到问题,需要您的帮助 :)

我需要将文章合并功能添加到遗留代码。

预计将按以下方式工作:

  1. 将“源”文章的文本合并到“目标”文章。
  2. 检查“来源”的评论,如果有的话,将它们重新关联到“目标”。
  3. 销毁“源”文章。注释应保留并与“目标”相关联。

这是我的文章模型代码(为便于阅读而减少)。

class Article < Content

  before_destroy :reload_associated_comments

  has_many :comments,   :dependent => :destroy, :order => "created_at ASC" do

  def reload_associated_comments
    unless self.comments.empty?
      article = Article.find(@merge_with)
      self.comments.each do |comment|
        comment.article = article
        article.save!
      end
    end
  end

  def merge_with(id)
    @merge_with = id
    article = Article.find(@merge_with)
    if !article.nil?
      text = article.body + body
      article.body = text
      article.save!
      self.destroy
      return article
    end
    nil
  end
end

这是评论模型(也减少了):

class Comment < Feedback
  belongs_to :article
end

问题是当我从before_destroy钩子返回时,没有任何东西保存到数据库中。我通过以下方式进行检查:

eval Article.find(target_article_id).comments

保存不会引发异常。我在这里缺少什么?

提前致谢!

这对我有用

  def merge_with(id)
    @merge_with = id
    article = Article.find(@merge_with)
    unless article.nil?
      text = article.body + body
      article.body = text
      article.save!
      reload_associated_comments
      self.reload
      self.destroy
      return article
    end
    nil
  end
4

1 回答 1

1

before_destroy实际上,Rails 在调用文章的回调之前会销毁每条评论。可悲的是,rails 就是这样工作的。更改此行为将意味着破坏旧版应用程序。您可以在此处找到有关此问题的更多信息:https ://github.com/rails/rails/issues/670

在我看来,最好的解决方案是覆盖该destroy方法并摆脱回调:

class Article < Content

  def destroy
    reload_associated_comments
    super
  end

  has_many :comments,   :dependent => :destroy, :order => "created_at ASC" do

  def reload_associated_comments
    unless self.comments.empty?
      article = Article.find(@merge_with)
      self.comments.each do |comment|
        comment.article = article
        comment.save!
      end
    end
  end

  def merge_with(id)
    @merge_with = id
    article = Article.find(@merge_with)
    if !article.nil?
      text = article.body + body
      article.body = text
      article.save!
      self.destroy
      return article
    end
    nil
  end
end

另外,正如@Zippie 提到的,您应该打电话comment.save!而不是article.save!

希望能帮助到你!

于 2013-03-13T23:10:59.420 回答