6

Post belongs_to :user我想为已删除用户保留帖子的应用程序。在查看作者已被删除的帖子时,这可能会导致视图出现错误。我试图这样做:

class Post < ActiveRecord::Base
  belongs_to :author, class_name: 'User', foreign_key: 'user_id'

  def author
    author || NullUser.new
    super
  end
end

这会导致“堆栈级别变深”错误。为什么?我可以这样做:

class Post < ActiveRecord::Base
  belongs_to :user

  def author
    user || NullUser.new
  end

  def author=(user)
    self.user = user
  end
end

但以这种方式搅乱我的联想似乎并不正确。解决这个问题的最佳方法是什么?

4

2 回答 2

14

要回答你的问题,

1. def author
2.   author || NullUser.new
3.   super
4. end

在第 1 行中,您正在定义一个author方法。然后在第 2 行,您再次调用该作者方法!这种情况不断发生,并且您得到堆栈级别太深的错误。正确的做法是,

def author
  super || NullUser.new
end

因此,您不会再次在其内部调用 author 方法。您只是在调用超类或返回 NullUser。如果您在调用时遇到 nil 错误,请super添加额外的 nil 检查:

def author
  (super || NullUser.new) rescue NullUser.new
end

救援语句将捕获所有错误然后返回 NullUser.new,因此您也不必担心超级抛出错误。

编辑:

另一种处理超级抛出异常的方法看起来更好:

def author
  (super rescue nil) || NullUser.new
end
于 2013-06-15T20:28:33.850 回答
3

如果您想保留已删除用户的帖子,最好不要真正“删除”它们。

另一种方法是“软删除”。只需添加一个布尔列,说“已删除”或“非活动”。

因此,当您要删除用户时,请检查他是否有帖子。如果没有,硬删除他。如果有,软删除。

这样事情就会变得更加简单和干净。

另一种方法是“窃取”帖子。删除用户时,将其所有帖子移至特殊用户帐户下,然后将其删除。

无论哪种方式,您都不会破坏关联。

于 2013-06-15T20:06:34.500 回答