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