2017-04-22 53 views
0

如果我有一個角色的用戶,像這樣:子類模型,我如何範圍ActiveRecord模型?

class User < ApplicationRecord 

class Manager < User 

    def after_initialize do |u| 
     u.role = User.roles[:manager] if u.new_record? 
    end 

那麼這將允許經理的所有實例自動填充有作用。但是,當我撥打電話時,例如Manager.all,那麼這會讓我回到用戶的所有實例,因爲它沒有初始化Manager。預期的行爲是通過角色管理器接收所有用戶。什麼是最好的方式去做這件事?

回答

1

如果您正在創建活動記錄模型的子類,則可能需要通過將type列添加到用戶類來實現單表繼承。

Docs

這將使經理對象自動爲Manager實例,而不是用戶實例初始化。

這也可以讓你打電話Manager.all,但有些消除了角色關係的需要。

我個人會選擇堅持使用角色關係,或者繼承用戶模型,但不能同時使用兩者。

+0

走這條路線基本上會失去使用枚舉的免費幫手方法,比如'user.manager?'是否有這樣的等價物? – Strawberry

+0

是的,這裏的不同解決方案各有其自己的權衡。 單表繼承適用於有許多類封裝相同信息的類,但在使用該信息時具有不同的行爲。 如果您知道您的用戶只有每個角色都有一個角色,那麼用於指示角色的用戶類的枚舉是很好的。 如果用戶可以有很多角色(經理和主管),那麼可能實施與「角色」模型具有多次通過關係可能更合適。 要獲得由enum給出的幫助器方法,您可以自己編寫它們。 – brendandeere

1

這個時候你要調用 與管理者角色的所有用戶添加到您的用戶模型

scope :manager, -> { where(role: "manager") } 

然後

做到這一點

User.manager 

如果仍想只用子將其作爲您子類中的默認範圍

class Manager < User 
    default_scope { where(role: "manager") } 
end