我想允许用户创建多个模型的草稿(例如文章、博客文章等)。我正在考虑通过为我当前的每个模型(例如 articleDraft、blogpostDraft 等)创建一个草稿模型来实现这一点。有一个更好的方法吗?为每个应该支持草稿的现有模型创建一个新模型似乎很麻烦,而且工作量很大。
5 回答
我认为更好的是在表中添加一个标志(例如:称为草稿的 int 列),以识别记录是否为草稿。
如我所见,拥有这样一个没有单独表格的列的优点:
使您的记录不草稿很容易(只需更改标志)
您不会重复数据(因为实际上您在草稿和非草稿记录中将拥有相同的数据)
编码将很容易,无需复杂的登录
所有数据都将在一个地方,因此出错的空间更小
我一直在研究Draftsman,这是一个 Ruby gem,用于创建 ActiveRecord 数据的草稿状态。
drafts
Draftsman 的默认方法是通过多态关系将所有草稿模型的草稿数据存储在单个表中。它将对象状态作为 JSON 存储在object
列中,并可选择将表示更改的 JSON 数据存储在object_changes
列中。
Draftsman 允许您根据需要为每个模型(例如 、 )创建单独的草图article_drafts
模型blog_post_drafts
。我同意这种方法相当麻烦且容易出错。
将草稿数据拆分为单独的模型(或仅draft
在主表上使用布尔标志,根据 sameera207 的回答)的真正优势在于,您最终不会得到一个drafts
包含大量记录的巨大表。我会提出,只有当您的应用程序有大量使用时,这才会成为一个真正的问题。
综上所述,我的最终建议是将所有草稿数据存储在主模型 ( blog
) 或单个drafts
表中,然后如果您的应用程序需要扩展,则根据需要分开。
查看 The Ruby Toolbox 中的Active Record 版本控制类别。目前的领导者是Paper Trail。
我会沿着状态机路线走。您可以仅在模型处于特定状态时验证每个属性。比多个复选框容易得多,并且每个状态更改都可以有一个操作(或多个操作)与之关联。
在模型中有一个标志有一些缺点:
除非数据有效,否则不能另存为草稿。当然,您可以跳过 Rails 模型中的验证,但请考虑数据库中定义的“NOT NULL”列
要查找“真实”记录,您必须使用过滤器(例如“WHERE draft = FALSE”)。这会降低查询性能。
作为替代方案,请查看我的 gem drafting。它将不同模型的草稿存储在单独的表中。