2

Mongoid の集約パイプライン (つまり、Mongo DB) をラップする DSL を作成しようとしています。

含まれていると、ブロックを受け入れるクラスメソッドを追加するモジュールを作成しました。これは、リクエストを Mongoid に渡すオブジェクトに渡します (メソッドの欠落を介して)。

だから私はできる:

class Project
  include MongoidAggregationHelper
end

result = Project.pipeline do
  match dept_id: 1
end

#...works!

"match" は Mongoid の集約パイプラインのメソッドで、傍受されて渡されます。

ただし、プロキシ クラスのコンテキストで実行されるため、ブロックの外側に設定されたインスタンス変数は使用できません。

dept_id = 1

result = Project.pipeline do
  match dept_id: dept_id
end

#...fails, dept_id not found :(

ブロックで外部インスタンス変数を渡す/再定義する方法はありますか?

以下は、トリミングされたコードです。

module MongoidAggregationHelper
  def self.included base
    base.extend ClassMethods
  end

  module ClassMethods
    def pipeline &block
      p = Pipeline.new self
      p.instance_eval &block
      return p.execute
    end
  end

  class Pipeline
    attr_accessor :cmds, :mongoid_class
    def initialize klass
      self.mongoid_class = klass
    end

    def method_missing name, opts={}
      #...proxy to mongoid...
    end

    def execute
      #...execute pipeline, return the results...
    end
  end
end
4

1 に答える 1