【发布时间】:2015-06-13 20:48:26
【问题描述】:
我正在尝试向活动记录对象动态添加范围。我通过元编程trying 所做的一些事情不起作用。以下是我想要实现的目标。
class UtilityClass
def add_scope_to_class klass, name, lambda
# should add something like
# scope :published, -> { where(published: true) }
code = lambda { filter_clause(value, &lambda) }
klass.class_exec(&code)
end
end
class Article < ActiveRecord::Base
end
UtilityClass.add_scope_to_class
Article.published # returns published articles
我已经用普通的 ruby 对象尝试了一些变体,但我认为在这种情况下提出问题可能会得到一些不同的想法/答案。
谢谢。
更新
到目前为止,我已经设法想出了以下方法,但它不起作用
class ActiveSearch
attr_accessor :collection
attr_reader :params
def initialize params={}
@params = params
end
def results
@collection = Person.where(nil)
params.compact.each do |key, value|
@collection = @collection.send("#{key}_filter", value)
end
@collection
end
def self.filter name, filter_proc
code = lambda { |filter_name| scope("#{filter_name.to_s}_filter".to_s, filter_proc) }
Person.class_exec(name, &code)
end
end
class PersonSearch < ActiveSearch
filter :first_name, ->(name){ where(first_name: name) }
end
我已经硬编码了一些东西。主要思想就在那里。
【问题讨论】:
标签: ruby scope metaprogramming