2014-03-18 25 views
1

长时间读者第一次的海报。“档案”轨道上的表

我最近开始在rails上使用ruby,所以我对环境仍然很陌生(即使我已经完成了一些指南),所以请温和。

我想要做的是创建一个用户可以随时访问(通过网站上的不同链接)的另一个表的存档表。因此,例如,如果我有“用户”表,我希望能够归档旧用户,但仍然可以让用户选择查看它们。 基本上,它将不得不从初始表中删除用户,并将他/她的信息保存到archived_users表中。

谢谢你的时间。

回答

1

我想我的意见是更多的答案,所以在这里张贴,并添加更多的信息

在这种情况下,你最好加入某种如果“活跃”标志到用户表,您可以根据需要打开或关闭该表。这样您就不必担心处理另一个模型类,并且可以重用所有相同的视图和控制器结构。在你的观点中,你可以简单地“隐藏”任何不活跃的用户(如果登录用户是管理员......等,也许只显示不活跃的人)。

您还可以自由添加其他元数据,例如“取消激活”(时间戳)。长话短说,如果你关心性能,如果有适当的索引(如果需要的话进行分区),你应该不需要创建一个单独的归档表。

我能想到这样做的唯一原因是,如果你处理的是数十亿记录的数十亿和/或疯狂的增长(这可能不是你的情况)。

+1

非常感谢。一个非常简单的解决方案,完全符合我的需求!最后一个问题是,将每个新用户的默认值设置为“主动”更好? – Meldanen

+0

@ user3435450我会在数据库中设置它。所以当你创建你的迁移时,你只需在列定义中添加':default => false'。你也可以使用'default_scope'来始终设置加载时的值(不喜欢这个想法,太多的工作),或者添加一个'before_save'回调来自动设置值(也是太多的工作)。如果出于某种原因,您不能在数据库中设置默认值,则这两种选择都是很好的。 –

+0

再次感谢您。我将不得不最后打扰你:) 因此,在做完所有这些之后,我需要为新的“.../users/archive”创建一个链接,用户将能够查看存档用户。 从我目前了解的情况来看,这意味着我需要去UsersController并在那里添加“def archive end”行,然后从终端运行“bundle exec rake routes”。 但是,在尝试转到“.../users/archive”url后,出现此错误“找不到具有id = archive的用户”和 提取源:“def set_user @ user = User.find (params [:id])end“ – Meldanen

1

执行此操作的最佳方法是在原始Users表上添加一个名为deleted。然后,您可以在正常情况下过滤掉旧用户(最好使用default scope),但在需要时允许他们查看/查询。

1

Papertrail可能适合你。

它创建一个“版本”表并记录任何类别的创建/更新/销毁事件,其中包括has_paper_trail。例如:

class User < ActiveRecord::Base 
    has_paper_trail 
end 

deleted_users = Papertrail::Version.where(item_type: User, event: "destroy") 

deleted_users.last.reify.name # assuming the users table has a 'name' column