Rails:总是使用“:dependent =>:destroy?”的好习惯。

时间:2012-07-02 14:19:51

标签: ruby-on-rails ruby-on-rails-3 activerecord associations

我最近遇到了一个实例,当时我从数据库中删除了一个用户,但Posts的索引页面因为编写特定帖子的用户不再存在而破了。

这让我想知道始终使用是否是好习惯:dependent => :破坏?或者是否有一个不那么复杂的替代解决方案,在删除用户时不会使整个页面中断?我想这更像是一个商业决策,但我认为当用户删除他的帐户时,我不一定要删除所有内容。

我想我可以使用像

这样的东西
<%= link_to post.author.username unless post.author.blank? ...... %>

但是,这将使得在每一行中都包含它将是一项非常繁琐和混乱的任务。

有关此问题的任何建议/提示吗?

3 个答案:

答案 0 :(得分:6)

而不是删除用户停用用户,这样您就不会破坏任何关系,您的数据将保持一致。

答案 1 :(得分:2)

您必须使用dependent: :destroy(或dependent: :delete)或使用deleted_at列软删除您的用户,然后确定用户的范围,以便检索未删除的用户。

您可以编写SoftDeletable模块,并将其包含在您要软删除的任何模型中,或使用其中一个宝石:https://www.ruby-toolbox.com/categories/Active_Record_Soft_Delete

答案 2 :(得分:1)

我认为有多种可能性。但这取决于你想要什么。

我不喜欢存储我的个人数据的网站,如果我希望他们删除它,请不要将其删除。

如果用户同意保留他的数据,您可以将deleted_at attr设置为true。当用户不满意时,删除他的个人资料和评论。

此外,您可以覆盖用户名的getter属性,以获取已删除用户的标准名称:

# author.rb
def username
  return read_attribute :username if deleted_at.blank?
  "unnamed"
end