1

モデル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実行時に定義する方法はありますか?

4

2 に答える 2

1

特定の のすべてのGatewayオブジェクトが必要な場合は、これを行っGatewayTypeてみませんか?

gateway_type = GatewayType.find(id)
gateway_type.gateways

この場合、あなたが持っていると仮定しhas_many :gatewaysますGatewayType。Rails の関連付けメソッドを使用すると、クエリを特定のGatewayTypeオブジェクトのゲートウェイのサブセットに制限できます。

于 2012-08-30T08:26:22.020 に答える
0

多くの「eval」やその他のものを試した後、上記で定義されたメソッドを次のように置き換えるだけで、次のように機能しました

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

そして、私が望むように動作しますGateway.scope1.xyzs.scope2

于 2012-08-30T08:32:23.933 に答える