2010-09-11 17 views
1

我有以下型號:添加相關的表到現有的表(書>修訂)

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(可能是 不同的用戶),以及新版本

    ,老書的文本,作爲存檔。

考慮到我有實例,用戶,書籍表在我的軌道 添加實施,這些都是正確的步驟,使上面的來的生活? - 添加遷移的BookRevision表.... 軌產生遷移AddTableBookRevision USER_ID:整數 版本:整數DIFF:文本 - 然後按以下步驟更新機型:

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

你可能想看看類似acts_as_versioned而不是滾動自己的東西。這是按照您在這裏描述的方式工作的,其中修改被保存到單獨但相關的表格中。

請記住,您必須將遷移應用到您的Book和BookRevision表中,並且從這一點開始並行。他們必須是模式兼容的修改工作。

我已經構建了這種使用序列化模型的版本跟蹤系統,以避免必須維護遷移,因爲意圖是保留模型的確切狀態,而不管通過遷移進行未來修改。這具有不能回滾到任意舊版本的缺點,因爲可能存在模式不匹配。