繁体   English   中英

从扩展关系模块中访问Rails类const

[英]Access Rails class const from within extended relation module

我正在继承/混合大脑放屁,想知道是否有人想启发我。

我在整个应用程序中都使用查询类来封装复杂的,特定于角色的查询。 例如,可能有一个PostQuery类和一个PhotoQuery类。

我还有一个基础查询类,它公开了诸如分页之类的通用关系扩展。

我遇到的问题是,我想从基本关系方法中访问包含类中定义的常量,但是无论我尝试过哪种继承/包含的组合,它都无法理解。

我在下面发布了一个简单的要点,并给出了一个简化的示例。 干杯。

https://gist.github.com/uberllama/9e69529b0d835902f33d

基于我之前提出的问题进行的self.inherited(sub_klass)解决方案-在基类中使用self.inherited(sub_klass)来调用sub_klass.const_get 然后使用sub_klass带有子类常量的define_method sendsub_klass

Ruby元编程:基于子实例属性的动态定义方法

class BaseQuery

  ALLOWED_SORT_ATTRS = []

  def initialize(relation)
    @relation = relation.extending(Scopes)
  end

  def self.inherited(sub_klass)
    sub_klass.send(:define_method, 'allowed_sort_attrs') do
      sub_klass.const_get(:ALLOWED_SORT_ATTRS)
    end
    sub_klass.send(:define_method, 'scoped') do
      Scope.new(sub_klass)
    end
  end

  class Scope
    def initialize(klass)
      @klass = klass 
    end

    def sorted(sort_param, sort_direction)
      if klass.allowed_sort_attrs.include(sort_param)
        order("#{sort_param} #{sort_direction}")
      else
        order("id DESC")
      end
    end
  end

end

现在,我决定只在方法中内插当前关系以获取const。

def sorted
  allowed_attr_names = "#{klass}Query".constantize.const_get(:ALLOWED_ATTR_NAMES)
end

在这种情况下,如果我属于Post关系,它将检索PostQuery::ALLOWED_ATTR_NAMES

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM