在运行时定义范围

时间:2012-08-30 08:18:35

标签: ruby-on-rails-3 activerecord

我有模型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

我不想采用上述方法,因为它不允许我在all_xyzs或其他范围(例如

)之间添加where
Gateway.scope1.all_xyzs.scope2

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

2 个答案:

答案 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