ROR访问模块在作用域

时间:2018-02-27 14:11:43

标签: ruby-on-rails ruby activerecord scope rails-activerecord

我尝试根据几个模型上的实体字段创建一个模块来管理访问。 我的实体字段的名称取决于调用它的当前模型的模式。

我的模块是:

 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>

我尝试了很多不同的语法,但没有任何效果。

如何在模块的范围内使用基于数据库模式的动态字段名称?

1 个答案:

答案 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