[英]Access Rails class const from within extended relation module
我正在繼承/混合大腦放屁,想知道是否有人想啟發我。
我在整個應用程序中都使用查詢類來封裝復雜的,特定於角色的查詢。 例如,可能有一個PostQuery類和一個PhotoQuery類。
我還有一個基礎查詢類,它公開了諸如分頁之類的通用關系擴展。
我遇到的問題是,我想從基本關系方法中訪問包含類中定義的常量,但是無論我嘗試過哪種繼承/包含的組合,它都無法理解。
我在下面發布了一個簡單的要點,並給出了一個簡化的示例。 干杯。
基於我之前提出的問題進行的self.inherited(sub_klass)
解決方案-在基類中使用self.inherited(sub_klass)
來調用sub_klass.const_get
。 然后使用sub_klass
帶有子類常量的define_method
send
到sub_klass
。
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.