6

我的问题:我应该推出自己的模型版本控制还是使用已经存在的版本控制 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 似乎更倾向于保留版本历史以进行跟踪,而不是真正用于维护历史信息以用于报告目的。

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

4

2 回答 2

46

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

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

于 2013-05-10T05:33:45.953 回答
-4

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

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

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

于 2013-03-05T22:59:07.677 回答