我有以下型号:
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(旧书副本), 时间戳) 逻辑:
鉴于我在我的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关联? 谢谢你帮助我!
答案 0 :(得分:1)
您可能希望查看acts_as_versioned之类的内容,而不是滚动自己的内容。这适用于您在此处描述的方式,其中修改保存在单独但相关的表中。
请记住,从那时起,您必须并行地将迁移应用到Book和BookRevision表。它们必须与模式兼容才能进行修订才能正常工作。
我已经构建了这种类型的版本跟踪系统,它使用序列化模型来避免必须维护迁移,因为目的是保留模型的确切状态,而不管将来通过迁移进行哪些修改。这样做的缺点是无法回滚到任意旧版本,因为可能存在架构不匹配。