1

我有模型GatewayGatewayType我正在寻找

Gateway.<gateway_type.name> # => Gateway.where(:gateway_type_id => gateway_type.id) 

现在这个<gateway_type.name>范围应该在运行时创建,类似于在运行时使用如下定义的方法添加类/实例级别的方法

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在运行时定义吗?

4

2 回答 2

1

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

gateway_type = GatewayType.find(id)
gateway_type.gateways

我假设在这种情况下你有has_many :gatewayson GatewayType。Rails 中的关联方法允许您将查询限制为特定GatewayType对象的网关子集。

于 2012-08-30T08:26:22.020 回答
0

在尝试了很多“评估”和其他东西之后,我得到了以下工作,只是将上面定义的方法替换为

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

它按照我的意愿工作Gateway.scope1.xyzs.scope2

于 2012-08-30T08:32:23.933 回答