0

当用户创建项目时,属性如下:

  • 用户名
  • 用户电子邮件
  • user_crawl

以及更多内容通过应用程序显示。

因为这些项目不会:dependent => :destroy在用户销毁他的帐户时应用程序刹车。

当用户销毁其帐户时,我如何保留该属性?

例子

:item belongs_to :user
:user has_many :items

一个项目有:

<%= item.user.id%>
<%= image_tag(item.user.avatar) %>
<%= item.user.crawl %>

即使用户不存在,也会显示项目。如何在视图中保留“姓名”“ID”“电子邮件”等属性。例如“项目是由 TestUser 创建的”,我可以以某种方式保留那个“TestUser”字符串吗?

4

2 回答 2

1

您似乎正在从 Item 委托给 User 模型。如果用户不再存在,这自然会中断。您可以指定“allow_nil”,它只会返回 nil:

class Item
   delegates :name, :to => :user, :allow_nil => true, :prefix => true
end

如果用户不存在,那么调用item.user_name将返回 nil。

编辑

如果要保留该信息,则不应删除关联的数据库记录。您可以添加一个disabled停用帐户的布尔列,但该记录仍将存在,以便数据保留在数据库中。

您的用户可能希望他们的数据被清除

于 2013-10-17T18:30:13.353 回答
1

软删除

为避免这种情况,通常我不会删除用户记录,而是通过软删除来停用用户的帐户,该软删除会删除user#passworduser#activated_at. 这样,您就可以确定您的数据库完整性不会受到损害。

当然,这可能存在隐私问题,因此请确保:

  • 仅保留绝对必要的数据(删除电子邮件、地址、电话号码等)
  • 仔细检查用户不会收到任何邮件或其他东西(删除电子邮件是一种好方法,unsubscribed无论如何,对于不想通信的注册用户,您也可能有一个属性,因此为想要删除其帐户的用户自动设置它)。

代理模型

另一种选择是将最重要的数据分组到另一个模型中。例如,您可以:

User.has_one :vcard
User.has_many :items, through: :vcard

Item.belongs_to :vcard
Item.has_one :user, through :vcard

Vcard.belongs_to :user
Vcard.has_many :items

AVcard将包含 user name, avatarand crawl(当然还有 auser_id因为它属于用户)。

使用它,您可以完全删除用户,并且项目仍然与具有相关信息的 Vcard 相关。不过,您可能应该将头像更改为某个占位符,以便对想要删除其帐户的用户表示友好。

该解决方案还可以很好地避免在您的用户模型中进行条件验证。

于 2013-10-17T18:45:02.267 回答