0

我不确定我是否理解关注点是如何运作的。我试图将一些通用代码包装到两个扩展的模块中ActiveSupport::Concern,但是当我同时包含这两个模块时,出现错误:

`included':无法为关注定义多个“包含”块(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

我一次只能包含一个关注点吗?我是否应该将两个 Scoped 模块移至 tenant_scoped 并将 user_scoped 移至 ClassMethods 并只关注一个模型扩展?

4

2 回答 2

1

我不确定 ActiveSupport::Concern 的问题是什么,但我不是它抽象的忠实粉丝。我只会使用标准的 ruby​​ 来完成你想要完成的事情,你不会有问题。将您的两个模块更改为如下所示

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 回答
1

您的问题是您很可能没有遵循 Rails 自动加载约定,即遵循模块/类名称结构的文件夹/文件命名。

有关详细信息,请参阅无法使用 cache_classes = true为关注 (ActiveSupport::Concern::MultipleIncludedBlocks) 定义多个“包含”块。

于 2014-07-09T12:57:30.943 回答