我尝试根据几个模型上的实体字段创建一个模块来管理访问。 我的实体字段的名称取决于调用它的当前模型的模式。
我的模块是:
module Modules::EntityManagement
extend ActiveSupport::Concern
def entity_field_name
self.class.connection.schema_search_path.split(",").first == 'public' ? 'entity_id' : 'entity_id__c'
end
included do
scope :myscope, lambda {
where('WHERE ? = ?', self.entity_field_name, 1)
}
end
end
当我在任何型号上调用它时
Mymodel.myscope
它返回错误
undefined method `entity_field_name' for #<Class:0x007ff62da60150>
我尝试了很多不同的语法,但没有任何效果。
如何在模块的范围内使用基于数据库模式的动态字段名称?
答案 0 :(得分:1)
你必须包装entity_field_name
所以它是一个类方法:
class_methods do
def entity_field_name
self.connection.schema_search_path.split(",").first == 'public' ? 'entity_id' : 'entity_id__c'
end
end
如果您还需要在实例级别添加:
def entity_field_name
self.class.entity_field_name
end