我有继承/ mixin脑屁,并想知道是否有人觉得有启发我。
我在整个应用程序中使用查询类来封装复杂的,特定于角色的查询。例如,可能有一个PostQuery类和一个PhotoQuery类。
我还有一个基本查询类,它为诸如分页之类的东西公开了通用关系扩展。
我遇到的问题是我想从基本关系方法中访问包含类中定义的常量,但无论我尝试过哪种继承/包含的组合,它都是我的意思
我在下面发布了一个简单的要点,并附有简化的破解示例。欢呼声。
答案 0 :(得分:0)
基于我之前提出的问题的复杂解决方法 - 在基类中使用self.inherited(sub_klass)
来调用sub_klass.const_get
。然后将此send
define_method
添加到sub_klass
,并使用子类的常量。
Ruby Metaprogramming: Dynamically defining method based on child instance attribute
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
答案 1 :(得分:0)
现在,我决定在方法中插入当前关系以获得const。
def sorted
allowed_attr_names = "#{klass}Query".constantize.const_get(:ALLOWED_ATTR_NAMES)
end
在这种情况下,如果我在Post关系中,它将检索PostQuery::ALLOWED_ATTR_NAMES