2014-03-18 36 views
1

長時間讀者第一次的海報。「檔案」軌道上的表

我最近開始在rails上使用ruby,所以我對環境仍然很陌生(即使我已經完成了一些指南),所以請溫和。

我想要做的是創建一個用戶可以隨時訪問(通過網站上的不同鏈接)的另一個表的存檔表。因此,例如,如果我有「用戶」表,我希望能夠歸檔舊用戶,但仍然可以讓用戶選擇查看它們。 基本上,它將不得不從初始表中刪除用戶,並將他/她的信息保存到archived_users表中。

謝謝你的時間。

回答

1

我想我的意見是更多的答案,所以在這裏張貼,並添加更多的信息

在這種情況下,你最好加入某種如果「活躍」標誌到用戶表,您可以根據需要打開或關閉該表。這樣您就不必擔心處理另一個模型類,並且可以重用所有相同的視圖和控制器結構。在你的觀點中,你可以簡單地「隱藏」任何不活躍的用戶(如果登錄用戶是管理員......等,也許只顯示不活躍的人)。

您還可以自由添加其他元數據,例如「取消激活」(時間戳)。長話短說,如果你關心性能,如果有適當的索引(如果需要的話進行分區),你應該不需要創建一個單獨的歸檔表。

我能想到這樣做的唯一原因是,如果你處理的是數十億記錄的數十億和/或瘋狂的增長(這可能不是你的情況)。

+1

非常感謝。一個非常簡單的解決方案,完全符合我的需求!最後一個問題是,將每個新用戶的默認值設置爲「主動」更好? – Meldanen

+0

@ user3435450我會在數據庫中設置它。所以當你創建你的遷移時,你只需在列定義中添加':default => false'。你也可以使用'default_scope'來始終設置加載時的值(不喜歡這個想法,太多的工作),或者添加一個'before_save'回調來自動設置值(也是太多的工作)。如果出於某種原因,您不能在數據庫中設置默認值,則這兩種選擇都是很好的。 –

+0

再次感謝您。我將不得不最後打擾你:) 因此,在做完所有這些之後,我需要爲新的「.../users/archive」創建一個鏈接,用戶將能夠查看存檔用戶。 從我目前瞭解的情況來看,這意味着我需要去UsersController並在那裏添加「def archive end」行,然後從終端運行「bundle exec rake routes」。 但是,在嘗試轉到「.../users/archive」url後,出現此錯誤「找不到具有id = archive的用戶」和 提取源:「def set_user @ user = User.find (params [:id])end「 – Meldanen

1

執行此操作的最佳方法是在原始Users表上添加一個名爲deleted。然後,您可以在正常情況下過濾掉舊用戶(最好使用default scope),但在需要時允許他們查看/查詢。

1

Papertrail可能適合你。

它創建一個「版本」表並記錄任何類別的創建/更新/銷燬事件,其中包括has_paper_trail。例如:

class User < ActiveRecord::Base 
    has_paper_trail 
end 

deleted_users = Papertrail::Version.where(item_type: User, event: "destroy") 

deleted_users.last.reify.name # assuming the users table has a 'name' column