6

私のアプリには、ユーザーだけでなく、管理者とスーパー管理者もいます。3 つすべてが同じ属性を共有するため、「user」、「admin」、または「super_admin」のいずれかの追加属性「role」を持つテーブルを 1 つだけ使用したいと思います。

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 も管理者に追加しています:

class Admin < User
  default_scope where(["role = ?", "admin"])

  # ...
end

ああ、そして... SuperAdmin.all はもう何も返しません。何故ですか?

4

2 に答える 2

9

複数の default_scope がある場合、ActiveRecord はそれらを連鎖させます。そのため、SuperAdmin.all は、"Admin" と "SuperAdmin" のロールを持つユーザーを探します。これは決して起こり得ません。

これを回避するには、継承されたモデルの default_scope をオーバーライドできるため、自分で self.default_scope を定義するだけです。

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

SuperAdmin.all は期待どおりに動作するはずです。

于 2012-09-07T13:38:19.830 に答える
8

私のようにこれに出くわす人は誰でも、別のオプションがあります(より良いimo)。

default_scopes配列として定義されているすべての を単純に削除できます。

class Admin < User
  # This line will clear all the default_scopes defined in parent classes
  self.default_scopes = []
  default_scope { ... }
end

https://apidock.com/rails/ActiveRecord/Base/default_scope/classのソース コードを参照して ください。後続のデフォルト スコープを配列に追加するだけであることがわかります。

self.default_scopes = default_scopes + [scope]
于 2017-04-05T00:39:22.200 に答える