0

懸念がどのように機能するかを理解しているかどうかはわかりません。いくつかの一般的なコードを を拡張する 2 つのモジュールにラップしようとしていますActiveSupport::Concernが、両方を含めるとエラーが発生します。

「含まれる」: 懸念に対して複数の「含まれる」ブロックを定義することはできません (ActiveSupport::Concern::MultipleIncludedBlocks)

module AppCore
  class Student
    include Mongoid::Document
    include Mongoid::Timestamps
    include AppCore::Extensions::Models::TenantScoped
    include AppCore::Extensions::Models::UserScoped
  end
end

module AppCore::Extensions::Models
  module TenantScoped
    extend ActiveSupport::Concern
    included do
      field :tenant_id, type: Integer
      belongs_to :tenant, class_name: 'AppCore::Tenant'
      association_name = self.to_s.downcase.pluralize
      AppCore::Tenant.has_many association_name.to_sym, class_name: self.to_s
    end
  end
end

module AppCore::Extensions::Models
  module UserScoped
    extend ActiveSupport::Concern
    included do
      field :user_id, type: Integer
      belongs_to :user, class_name: 'AppCore::User'
    end
  end
end

一度に 1 つの懸念のみを含めることはできますか? 2 つの Scoped モジュールを tenant_scoped に移動し、user_scoped を ClassMethods に移動して、1 つのモデル拡張のみを考慮に入れる必要がありますか?

4

2 に答える 2

1

ActiveSupport::Concern の何が問題なのか正確にはわかりませんが、私はその抽象化の大ファンではありません。あなたが達成しようとしていることを行うために標準のルビーを使用するだけで、問題はありません。両方のモジュールを次のように変更します

module AppCore::Extensions::Models
  module UserScoped
    def self.included(klass)
      klass.class_eval do 
        field :user_id, type: Integer
        belongs_to :user, class_name: 'AppCore::User'
      end
    end
  end
end
于 2014-07-02T21:55:17.903 に答える