1

懸念があります:

# app/models/concerns/rolable.rb
module Rolable
  extend ActiveSupport::Concern

  included do
    rolify
    Role.find_each do |role|
      scope "#{role.name.pluralize}", -> { joins(:roles).where(roles: {name: send("#{role.name}_role_name")}).distinct }
    end

  end

 class_methods do
   Role.find_each do |role|
     define_method "#{role.name}_role_name" do
       role.name
     end

     define_method "#{role.name}_role_id" do
       role.id
     end
   end
 end

 Role.find_each do |role|
   define_method("#{role.name}?") do
     has_role? self.class.send("#{role.name}_role_name")
   end
 end

end

ご覧のとおり、一連のスコープ、クラス メソッド、およびインスタンス メソッドが定義されています。しかし、私は の繰り返しに満足していませんRole.find_each do |role| ... end

この重複をなくすにはどうすればよいですか?私はこれを試しました

Role.find_each do |role|
  included do
    ...
  end
  class_methods do
    ...
  end
end

includedしかし、複数のブロックがあるため機能しません。メソッドで抽出できますRole.find_eachが、あまり良くありません。

このコードを改善して重複を取り除くにはどうすればよいですか?

4

2 に答える 2

3

ここであなたは悪い論理を持っていると思います。基本クラスを初期化した後は新しいロールを使用Role.find_eachできなくなるか、必要なときに毎回明示的に懸念事項をロードする必要があるため、使用しないでください。

roifyには便利なメソッドがあります:

Forum.with_role(:admin)
Forum.with_role(:admin, current_user)
@user.has_role?(:forum, Forum)
...
于 2015-09-15T08:29:44.520 に答える
1

ロールのインベントリが拡大しないことが確実な場合は、すべてのロールに対して 1 つの懸念を作成する代わりに、一連の匿名の懸念を動的に定義することができます。

# models/concerns/rolables.rb
# no need to call `find_each' because the number or roles will never exceed 1000
Rolables = Role.all.map do |role|
  Module.new do
    extend ActiveSupport::Concern

    included do
      scope "#{role.name.pluralize}", -> { joins(:roles).where(roles: {name: send("#{role.name}_role_name")}).distinct }

      define_method("#{role.name}?") do
        has_role? self.class.send("#{role.name}_role_name")
      end
    end

    class_methods do
      define_method "#{role.name}_role_name" do
        role.name
      end

      define_method "#{role.name}_role_id" do
        role.id
      end
    end
  end
end

そして、これらすべての懸念事項をモデルに含めます。

# models/user.rb
class User
  Rolables.each{|concern| include concern}
end
于 2015-09-15T08:39:09.483 に答える