簡體   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