将关联表添加到现有表(Book> Revision)

时间:2010-09-11 17:28:45

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

我有以下型号:

class Instance < ActiveRecord::Base 
 has_many :users 
 has_many :books 
end 
class User < ActiveRecord::Base 
 belongs_to :instance 
end 
class Book < ActiveRecord::Base 
 belongs_to :instance 
end 

我现在想要添加一个BookRevision表,它包含以下列 (id,user_id,版本#(自动增量),diff(旧书副本), 时间戳) 逻辑:

  • 创建图书时,记录为 添加到BookRevision表中,所以 我们知道是谁创造了这本书 第一名
  • 更新图书时,会添加一条带有user_id的记录(可能是 不同的用户)和新版本

    和旧书文本,作为档案。

鉴于我在我的rails中实现了Instance,User,Book表 添加,这些是使上述变为现实的正确步骤吗?   - 为BookRevision表添加迁移....     rails生成迁移AddTableBookRevision user_id:integer version:整数diff:text   - 然后按如下方式更新模型:

class Instance < ActiveRecord::Base 
 has_many :users 
 has_many :books 
end 
class User < ActiveRecord::Base 
 belongs_to :instance 
end 
class Book < ActiveRecord::Base 
 belongs_to :instance 
 has_many :BookRevisions 
end 
class BookRevision  < ActiveRecord::Base 
 belongs_to :Book 
end 

然后在我的控制器中添加新书?现在我有:

@book = Book.create(params[:book].merge(:instance_id => 
current_user.instance_id)) 

如何更新以解释BookRevision关联? 谢谢你帮助我!

1 个答案:

答案 0 :(得分:1)

您可能希望查看acts_as_versioned之类的内容,而不是滚动自己的内容。这适用于您在此处描述的方式,其中修改保存在单独但相关的表中。

请记住,从那时起,您必须并行地将迁移应用到Book和BookRevision表。它们必须与模式兼容才能进行修订才能正常工作。

我已经构建了这种类型的版本跟踪系统,它使用序列化模型来避免必须维护迁移,因为目的是保留模型的确切状态,而不管将来通过迁移进行哪些修改。这样做的缺点是无法回滚到任意旧版本,因为可能存在架构不匹配。