2012-08-30 42 views
1

我有模型GatewayGatewayType一个范围,我找定义在运行时

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 

我不想去与上面的方法,因为它不会让我在where或其他范围之间添加all_xyzs

Gateway.scope1.all_xyzs.scope2 

那么......有没有办法在运行时定义scope

回答

1

如果你想为一个特定GatewayType所有Gateway对象,为什么不这样做呢?

gateway_type = GatewayType.find(id) 
gateway_type.gateways 

我认为在这种情况下,你必须对GatewayTypehas_many :gateways。 Rails中的关联方法将允许您限制对特定对象的网关子集的查询。

+0

你是对的,但仍然是原因,1)我想知道我们是否可以在运行时添加范围,2)我希望看到类似“Gateway.scope1.xyzs.scope2”的代码。 –

+1

是的,您可以在运行时添加范围。只需调用类'scope'方法,你想一个范围增加。 –

0

尝试了很多“EVAL”和其他的东西后,我得到了下面的工作 刚刚更换上面定义的方法

define_method "#{type.name}" do 
    where(:gateway_type_id => type.id) 
    end 

其工作按我想Gateway.scope1.xyzs.scope2