【问题标题】:Rails - Good way to support creation of drafts for several modelsRails - 支持为多个模型创建草稿的好方法
【发布时间】:2012-12-29 20:50:46
【问题描述】:

我希望允许用户创建多个模型的草稿(例如文章、博客文章等)。我正在考虑通过为我当前的每个模型(例如 articleDraft、blogpostDraft 等)创建一个草稿模型来实现这一点。有一个更好的方法吗?为每个应该支持草稿的现有模型创建一个新模型似乎很麻烦,而且工作量很大。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2


    【解决方案1】:

    我认为更好的是在表中添加一个标志(例如:称为草稿的 int 列),以识别记录是否为草稿。

    如我所见,拥有这样一个没有单独表格的列的优势:

    1. 让您的记录不草稿很容易(只需更改标志)

    2. 您不会重复数据(因为实际上您在草稿和非草稿记录中将拥有相同的数据)

    3. 编码将很容易,无需复杂的登录

    4. 所有数据都在一个地方,因此出错的空间更小

    【讨论】:

    • 想这样做,但很多这些模型都有必填字段,但我希望我的草稿没有要求
    • 跳过记录中的验证是草稿(您可以使用'with_options'),例如:with_options :if => :is_admin?做 |管理员| admin.validates :password, :length => { :minimum => 10 } admin.validates :email, :presence => true end ,检查guides.rubyonrails.org/active_record_validations_callbacks.html中的5.4
    【解决方案2】:

    我一直在研究Draftsman,这是一个 Ruby gem,用于创建 ActiveRecord 数据的草稿状态。

    Draftsman 的默认方法是通过多态关系将所有草稿模型的草稿数据存储在单个 drafts 表中。它将对象状态作为 JSON 存储在 object 列中,并可选择将表示更改的 JSON 数据存储在 object_changes 列中。

    Draftsman 允许您根据需要为每个模型创建单独的草稿模型(例如,article_draftsblog_post_drafts)。我同意这种方法相当麻烦且容易出错。

    将草稿数据拆分为单独的模型(或仅在主表上使用布尔值 draft 标志,根据 sameera207 的回答)的真正优势在于您最终不会得到一个巨大的 drafts 表有大量的记录。我认为只有当您的应用程序有大量使用时才会成为一个真正的问题。

    也就是说,我的最终建议是将所有草稿数据存储在主模型 (blog) 或单个 drafts 表中,然后在您的应用程序需要扩展时根据需要分开。

    【讨论】:

      【解决方案3】:

      查看 The Ruby Toolbox 中的 Active Record Versioning 类别。现任领导是Paper Trail

      【讨论】:

      • 能否保存未通过验证的修订?例如,一篇文章应该始终有一个标题,但一篇文章草稿可以有一个空标题
      • @zazinteractive,是的,请参阅sameera207 的回答评论。
      【解决方案4】:

      我会沿着状态机路线走。您可以仅在模型处于特定状态时验证每个属性。比多个复选框容易得多,并且每个状态更改都可以有一个(或多个)与之关联的动作。

      【讨论】:

        【解决方案5】:

        在模型中有一个标志有一些缺点:

        • 除非数据有效,否则不能另存为草稿。当然,您可以跳过 Rails 模型中的验证,但请考虑数据库中定义的“NOT NULL”列

        • 要查找“真实”记录,您必须使用过滤器(如“WHERE Draft = FALSE”)。这会降低查询性能。

        作为替代方案,请查看我的 gem drafting。它将不同模型的草稿存储在单独的表中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-24
          • 1970-01-01
          • 2021-05-25
          • 1970-01-01
          • 1970-01-01
          • 2018-04-19
          • 1970-01-01
          • 2010-11-09
          相关资源
          最近更新 更多