我有模型Gateway
和GatewayType
,我正在寻找
Gateway.<gateway_type.name> # => Gateway.where(:gateway_type_id => gateway_type.id)
现在这个<gateway_type.name>
范围应该在运行时创建,类似于在运行时使用如下所示的defined_method添加类/实例级方法
class Object
def metaclass
class << self
self
end
end
end
# adding class level methods
GatewayType.all.each do |type|
# adding methods to Gateway
Gateway.metaclass.class_eval do
define_method "all_#{type.name}" do
Gateway.where(:gateway_type_id => type.id)
end
end
end
我不想采用上述方法,因为它不允许我在all_xyzs
或其他范围(例如
where
Gateway.scope1.all_xyzs.scope2
那么......有没有办法在运行时定义scope
?
答案 0 :(得分:1)
如果您想要特定Gateway
的所有GatewayType
个对象,为什么不这样做呢?
gateway_type = GatewayType.find(id)
gateway_type.gateways
在这种情况下,我假设您has_many :gateways
上有GatewayType
。 Rails中的关联方法允许您将查询限制为特定GatewayType
对象的网关子集。
答案 1 :(得分:0)
在尝试了很多'eval'和其他东西后,我得到了以下工作 只需将上面定义的方法替换为
define_method "#{type.name}" do
where(:gateway_type_id => type.id)
end
并按其我的工作Gateway.scope1.xyzs.scope2