【问题标题】:Rails 3.2 app - Should I use a versioning gem (paper_trail or vestal_versions) or handle it manually?Rails 3.2 应用程序 - 我应该使用版本控制 gem(paper_trail 或 vestal_versions)还是手动处理?
【发布时间】:2013-03-05 22:38:14
【问题描述】:

我的问题:我应该推出自己的模型版本控制还是使用已经存在的版本控制 gem 之一?如果我应该使用 gem,哪一个似乎最适合这个应用程序?

关于我的应用的信息

我的应用是一个简单的清单应用。有清单和工作,我使用响应和提交来跟踪用户响应。响应告诉我使用说什么(“完成”,附注“我们需要更多拖把。”),提交告诉我该特定清单何时填写(因为可能有许多提交和给定的响应集清单)。如果有帮助,我将在下面显示我的关联。

#checklist.rb
class Checklist < ActiveRecord::Base
  has_many :jobs, :through => :checklists_jobs
  has_many :submissions
end

#job.rb
class Job < ActiveRecord::Base
  has_many :checklists, :through => :checklists_jobs
  has_many :responses
end

#response.rb
class Response < ActiveRecord::Base
  belongs_to :job
  belongs_to :submission
  belongs_to :user
end

#submission.rb
class Submission < ActiveRecord::Base
  belongs_to :user
  belongs_to :checklist
  has_many :responses
end

我想用版本控制做什么

我想做的是记录用户对清单上的工作的反应。但我想确保如果清单发生更改,我可以重现原始清单(带有响应信息)。例如,我想确保我可以为所有以前版本的清单回答这个问题:

“清单是什么样的,三个星期二前的反应是什么?”

如果我更改清单或其任何工作,我不想失去该问题的答案。

我认为最好的方法是使用版本控制(用于作业和清单)。例如,如果管理员更改了作业(名称或描述),那么我不会更新现有作业,而是创建一个新版本并保持旧版本不变。然后我就把旧的东西留在原地,把清单指向工作的新版本。

我应该使用宝石还是自己滚动?

我要决定是自己动手(编写代码以增加版本,将所有内容指向版本,并保留以前的版本)还是使用现有的解决方案。两个最好的解决方案似乎是paper_trail 和vestal_versions。我没有足够的声望点来发布两个以上的链接,所以我将链接到 gem 的每个 Railscast(如果你愿意,它会让你到 gem 本身)。 Railscast 255 Undo with paper_trailRailscast 177 Model Versioning - 177 使用了vestal_versions。

自己动手的优点:

  • 我需要通过重建清单来报告所有历史数据 以及他们的回应。这是该应用程序的主要功能。这好像是 这对于我提到的宝石来说会很棘手。
  • 我可以报告 关于版本组(“我想查看任何版本的所有回复 这份工作”)。这样看来很容易。

自己滚动的缺点:

  • 这会很棘手,因为我有几个 has_many :through 关联。我必须非常小心地更新所有表并正确连接表。 (这也可能是其中一颗宝石的问题)。
  • 由于我使用此版本数据进行报告,因此我担心性能问题。解析散列的计算成本似乎很高,而依赖带有索引的平面表似乎非常有效。
  • 这两个 gem 似乎更适合保留版本历史以供跟踪,而不是真正用于维护历史信息以进行报告。

这似乎很重要,因为无论我决定什么,我基本上都会坚持下去。我认为以后从一种方法切换到另一种方法并不容易。

【问题讨论】:

    标签: ruby-on-rails-3.2 gem database-versioning paper-trail-gem vestal-versions


    【解决方案1】:

    使用 PaperTrail,不要推出自己的解决方案。我强烈不同意理查德的回答。 PaperTrail 是一个非常活跃的项目,有很多人为错误修复做出贡献,支持最新的 Rails 和 Ruby 版本,并处理 gem 冲突。

    如果你不喜欢 PaperTrail 做某事的方式,你应该分叉它并改变这种行为。如果是一般性改进,请提交拉取请求,以便我们都能从您的工作中受益。不要从头开始重写它,因为您没有事后发现 PaperTrail 提交者已经经历过的错误和极端情况。

    【讨论】:

    • 不得不同意这种观点。当您的编码时间不足时,无需自己更新即可获得功能是一件好事。您不必花费额外的时间来自己维护图书馆,而只是为了获得微不足道的收益。这是 Ruby,添加一些您确实需要的功能(并在其上运行上述测试),然后向上游推送,或者使用针对您的应用程序的开放封闭原则保持本地化会更容易。
    【解决方案2】:

    我的经验是,当您询问有关制作自己的解决方案与使用第三方解决方案的问题时,答案几乎总是“自己动手”。您不仅可以在功能方面完全满足您的需求,而且您无需依赖其他开发人员:

    1. 修复他们的错误
    2. 支持最新的rails更新/ruby更新等
    3. 不会在某些方面与您的应用发生您无法解决的微妙冲突(需要不同版本的依赖 gem)。

    我说如果你有能力,你应该花时间写出你想要的东西。两年后,它将获得丰厚的回报。

    【讨论】:

    • 理查德,这是一个很好的答案。我将暂缓将其投票为首选答案,以防万一有人有更尖锐的观点,但我喜欢你的推理并同意它。感谢您的周到回复!
    • 你自己滚了吗?
    • 或者例如永远不要更新vestal_version gem 来支持rails 4,并不是说我很苦或什么
    • 我觉得奇怪的是,这个答案正在宣传“这里没有发明”的哲学。当然,有时会推出自己的解决方案来解决问题,但总的来说,我会说相反的情况。如果您可以使用预先构建的解决方案来解决已知问题,那么这几乎总是更好的选择。您可以免费获得很多东西,包括初始源代码和错误修复,您可以随时 fork 自己修复错误。我会问 Richard,他是用自己的 ORM 代替 ActiveRecord,用自己的 CGI 库代替 Rack,用自己的 http 库代替 nethttp 或 typheous?
    • 必须同意这里的批评。当有广泛使用、受支持且稳定的第三方库时,您应该使用它们。它们将涵盖许多您不会想到的边缘情况,经过测试,具有您没有时间实施的功能,并为您节省大量时间。当第三方库没有很好地实现,或者它是核心竞争力时,肯定有一个地方可以滚动你自己的。这不是其中之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2015-01-03
    • 2011-08-11
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多