Ruby on rails 保持与作为偏执狂的行为的联系

Ruby on rails 保持与作为偏执狂的行为的联系,ruby-on-rails,authlogic,acts-as-paranoid,rails-activerecord,Ruby On Rails,Authlogic,Acts As Paranoid,Rails Activerecord,我有两个模型,一个是用户,另一个是评论。评论属于用户 class User < ActiveRecord::Base act_as_paranoid has_many :comments end class Comment < ActiveRecord::Base belongs_to :user end 当我在控制器中执行user.delete时,我会得到设置已删除的列并隐藏记录的预期结果 我的问题是用户的注释关联设置为null。因此,现在在网站上显示没

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

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

class Comment < ActiveRecord::Base
    belongs_to :user
end
当我在控制器中执行user.delete时,我会得到设置已删除的列并隐藏记录的预期结果

我的问题是用户的注释关联设置为null。因此,现在在网站上显示没有用户拥有该评论。我希望评论仍然显示用户的名字不是无或匿名等

查看github上的源代码,它似乎调用了run_回调,这反过来会导致Rails 3退回到取消关联的默认值

在我的情况下,我只希望删除时关闭用户帐户。不再显示在查询中,因此Authlogic将拒绝它们,并且用户索引页将不会显示它们。但是仍然允许用户拥有的一切仍然归他们所有,因为他们可能会回来,等等


有没有更好的方法来做到这一点,然后表现得像个偏执狂?

而不是麻烦地重写destroy方法我创建了一个close方法,它只是将closed设置为一个时间戳。如果将默认范围设置为以下内容:

default_scope { where("closed_at IS NULL") }
然后该模型将不会显示给任何查询,包括User.All。你可以删除范围来得到一个完整的查询,基本上我把这些想法从act_作为偏执狂,但要简单得多。问题是,即使注释仍然设置了user_id,默认作用域也会在任何关联负载下运行。这么说

c = Comment.first
c.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
这样关闭的帐户就无法登录。在视图中列出用户的任何地方,我都使用隐藏范围

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