1

我有两个模型,其中一个是用户,另一个是评论。评论属于用户。

class User < ActiveRecord::Base
    act_as_paranoid
    has_many :comments
end

class Comment < ActiveRecord::Base
    belongs_to :user
end

当我在控制器中执行 user.delete 时,我得到了设置的 deleted_at 列和隐藏记录的预期结果。

我的问题是用户的评论关联设置为空。所以现在在网站上它显示没有用户拥有评论。我希望评论仍然显示用户名不是“无”或“匿名”等。

查看 github 上的源代码https://github.com/goncalossilva/rails3_acts_as_paranoid/blob/rails3.2/lib/acts_as_paranoid/core.rb似乎调用 run_callbacks 反过来导致 Rails 3 回退到 Nullify 默认的关联.

就我而言,我只想在删除时关闭用户帐户。不再出现在查询中,因此 Authlogic 将拒绝它们并且用户索引页面不会显示它们。但仍然允许用户拥有的所有东西仍然归他们所有(因为他们可能会回来,等等)。

还有比acts_as_paranoid更好的方法吗?

4

1 回答 1

0

而不是去覆盖destroy方法的麻烦,我创建了一个简单地将closed_at设置为时间戳的close方法。如果您将默认范围设置为:

default_scope { where("closed_at IS NULL") }

然后该模型将不会显示给包括 User.All 在内的任何查询。您可以删除范围以获得完整的查询,基本上我从 act_as_paranoid 中汲取了这些想法,但更加简化了。问题是,即使 Comments 仍然设置了 user_id,默认范围也会与任何关联负载一起运行。所以说

c = Comment.first
c.user

如果 user_id 是一个关闭的帐户,那将输出 nil。在我的情况下,最简单的解决方案是删除默认范围并将我的 Authlogic 函数修改为:

def self.find_by_username_or_email(login)
  u = User.find(:first, :conditions => ["lower(username) = ?", login.downcase]) || User.find_by_email(login)
  return u unless u.closed_at  
end

这种方式关闭的帐户无法登录。我在视图中列出用户的任何地方都使用了 hide_closed 范围。

不确定这是否是最好最优雅的解决方案。但就我的目的而言,它有效。

于 2013-01-21T13:16:13.937 回答