Ruby on rails 3.2 Rails 3.2应用程序-我应该使用版本控制gem(paper_trail或vestal_版本)还是手动处理?

Ruby on rails 3.2 Rails 3.2应用程序-我应该使用版本控制gem(paper_trail或vestal_版本)还是手动处理?,ruby-on-rails-3.2,gem,database-versioning,paper-trail-gem,vestal-versions,Ruby On Rails 3.2,Gem,Database Versioning,Paper Trail Gem,Vestal Versions,我的问题:我应该推出自己的模型版本控制还是使用已经存在的版本控制宝石之一?如果我应该使用gem,那么哪一个最适合此应用程序? 有关我的应用程序的信息 我的应用程序是一个简单的清单应用程序。有检查表和作业,我用响应和提交跟踪用户响应。回复告诉我用户说了什么(“完成”,并注明“我们需要更多拖把”),提交的内容告诉我特定清单的填写时间(因为对于给定的清单,可能会有许多提交和一组回复)。我将在下面展示我的关联,以防有所帮助 #checklist.rb class Checklist < Activ

我的问题:我应该推出自己的模型版本控制还是使用已经存在的版本控制宝石之一?如果我应该使用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
#checklist.rb
类清单:检查表\u作业
你有很多意见书吗
结束
#job.rb
类作业:检查表\u作业
有很多:回应
结束
#response.rb
类响应
我试图用版本控制做什么

我想做的是将用户对作业的响应记录在检查表上。但我想确保,如果清单发生变化,我可以复制原始清单(带有响应信息)。例如,我想确保我能回答清单所有以前版本的问题:

“检查表是什么样子的,三天前的回答是什么?”

如果我改变了清单或它的任何工作,我不想失去这个问题的答案

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

我应该使用宝石还是自己的

我试图决定的是,我是应该使用自己的解决方案(编写代码以增加版本,将所有内容指向该版本,并保留以前的版本)还是使用现有的解决方案。两个最好的解决方案似乎是纸制和维斯塔尔版本。我没有足够的声望点数来发布两个以上的链接,所以我会链接到每个gem的Railscast(如果你想的话,这会让你访问gem本身)。和-177使用维斯塔卢版本

我自己滚动的优点:

  • 我需要通过重建检查表来报告所有历史数据 以及他们的反应。这是该应用程序的一个主要功能。好像 这将是棘手的宝石我提到
  • 我可以报告 在版本组上(“我想查看任何版本的所有响应 这项工作的职责”)。这样看来很容易
滚动我自己的缺点:

  • 这将是一个棘手的问题,因为我有很多:通过关联。我必须非常小心地更新所有表并正确地联接表。(这也可能是其中一个GEM的问题)
  • 由于我使用此版本数据进行报告,因此我担心性能问题。解析散列在计算上似乎很昂贵,而依赖带有索引的平面表似乎相当有效
  • 这两个gem似乎更适合于保存版本历史以进行跟踪,而不是真正用于维护历史信息以进行报告

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

我的经验是,当你问自己的解决方案与使用第三方解决方案的问题时,答案几乎总是“自己动手”。你不仅可以在功能上完全做到你想要的,您不必感谢其他开发人员:

  • 修复他们的错误
  • 支持最新的rails更新/ruby更新等
  • 不要以你无法解决的微妙方式与你的应用程序发生冲突(需要不同版本的从属gems)

  • 我说,如果你有能力,你应该花时间写你想要的东西。从现在起两年后,它将获得巨大的回报。

    使用书面记录,不要推出自己的解决方案。我强烈反对理查德的回答。PaperTrail是一个非常活跃的项目,有许多人参与修复bug,支持最新的Rails和Ruby版本,并处理gem冲突


    如果你不喜欢PaperTrail做某事的方式,你应该放弃它并改变这种行为。如果这是一个总体改进,请提交一个拉动请求,以便我们都能从您的工作中受益。不要从头开始重写它,因为你没有对PaperTrail提交者已经经历过的bug和边缘案例的事后了解。

    Richard,这是一个很好的答案。我将暂缓把它作为首选答案,以防有人有更尖锐的观点,但我喜欢你的推理并同意它。感谢您周到的回复!你是不是自己开发的?或者说,你从来没有更新过vestal_版本的gem来支持rails 4,不是因为我很痛苦或者其他什么,我觉得奇怪的是,这个答案是在推广一种“不是在这里发明的”哲学。当然,有时你可以自己解决一个问题,但总的来说,我想说的恰恰相反。如果您可以使用预先构建的解决方案来解决已知问题,那么这几乎总是更好的选择。你可以免费获得很多,包括初始源代码和bug修复,你可以自己动手修复bug。我会问Richard,他是否使用自己的ORM而不是ActiveRecord,是否使用自己的CGI库而不是Rac