gpt4 book ai didi

inheritance - Rails : ActiveRecord's default_scope and class inheritance

转载 作者:行者123 更新时间:2023-12-04 17:02:23 26 4
gpt4 key购买 nike

我的应用程序不仅具有“用户”,而且还具有“管理员”和“ super 管理员”。由于所有这三个共享相同的属性,因此我只想使用一个带有附加属性“role”的表,该属性可以是“user”,“admin”或“super_admin”:

class User < ActiveRecord::Base
# with nickname and password
end


class Admin < User

def power
puts "admin rights"
end
end


class SuperAdmin < Admin

def superpower
puts "I've got the #{power}!"
end
end

现在,我想做一些类似于 SuperAdmin.all的操作,以仅获取SuperAdmins。使用default_scope似乎可以帮助我:
class SuperAdmin < Admin
default_scope where(["role = ?", "super_admin"])

# ...
end

现在,我也将default_scope添加到Admin中:
class Admin < User
default_scope where(["role = ?", "admin"])

# ...
end

Aaaand ... SuperAdmin.all不再返回任何内容。这是为什么?

最佳答案

如果存在多个default_scope,则ActiveRecord会将它们链接起来。因此,SuperAdmin.all寻找具有“管理员”和“ super 管理员”角色的用户-这是永远不可能发生的。

为了解决这个问题,您可以覆盖继承的模型的default_scope,因此只需自己定义一个self.default_scope即可:

 class SuperAdmin < Admin
def self.default_scope
where(["role = ?", "super_admin"])
end
#...
end

SuperAdmin.all现在应该可以按预期工作。

关于inheritance - Rails : ActiveRecord's default_scope and class inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12319258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com