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