2012-08-30 45 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