![](/img/trans.png)
[英]Best way to implement superclass subclass model based design in rails database?
[英]Rails - best database design for existing model
因此,我繼承了一些需要添加的Rails 4代碼和數據庫模型。
名為mpb_item
的模型有一個名為mpb_items
的表。
在該項目表內有諸如以下的列:
role1_start_date, role2_start_date, role3_start_date, role4_start_date
不理想,但這就是事實。 我猜他們應該在單獨的角色表中。
我需要添加功能來掛起這些角色中的任何一個(或全部)。
我想我可以:
在現有表中,我可以為每個現有角色列添加一個新的布爾列。 例如: role1_suspended
, role2_suspended
等
創建一個名為mpb_suspensions
表,該表包含2列: mpb_item_id
和role_name
。 由於角色本身沒有id,因此role_name列將存儲“ role1”或“ role2”等,具體取決於掛起的角色。
在我的View
,我需要有“暫停”的能力,每個作業,或全部。 我不確定模型代碼將如何執行此操作,哪種方法最好。
如果必須構建它,請在您提供的最少信息的基礎上,選擇您描述的選項2。 (RoleSuspension是它自己的表)好處包括:
按照選項2的邏輯,掛起角色將涉及創建這樣的新記錄:
@mbp_item.role_suspensions.create!(role_number: 2)
而檢查暫停狀態將涉及以下內容:
if @mbp_item.role_suspensions.any?
# or....
RoleSuspension.where(role_number: 3).each do |s|
puts "Item #{s.mbp_item} is suspended for role #{s.role_number}."
end
根據以下問題的答案,使用這種方法將更加考慮數據庫性能:
mbp_item
狀態? 如果您需要非常頻繁地檢查角色掛起,也許應該在mbp_items
添加一個名為has_suspensions
的布爾列,這將是部分緩存,因為它將指示此MbpItem是否存在任何掛起(必須在after_create
維護)和after_destroy
掛鈎)。
另一方面,如果您知道掛起信息永遠不需要其自己的邏輯,也永遠不需要直接查詢,則可以在MbpItem中添加單個列role_suspensions
,其中包含一個用於掛起角色的整數序列化數組。 就數據庫結構而言,這將是一種侵入性較小的方法,甚至可能比選項1更簡單,因為它允許您以更少的代碼和更少的元編程來掛起和取消掛起任何角色編號,但是如果您需要的話在暫停或取消暫停過程中添加任何奇特的邏輯(即,如果RoleSuspension應該將狀態作為其自己的對象),您會后悔這種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.