1

こんにちは、Ruby 1.8.7 (現在、これを 1.9.2 に更新する立場にありません) でアプリケーションを実行しており、Rails 3.0.9 で mongoid 2.2.2 を実行しています。

次のように定義した名前付きスコープがいくつかあります



scope :for_pickups, where(:state => "accepted")
scope :confirmed_shipments, where(:state => "confirmed", :created_at.lt => Date.today - 1.day).desc(:created_at).limit(10)
scope :undelivered_shipments, Proc.new{ |start_date_utc, end_date_utc|
                                  start_date_utc = (Date.today - 7.days).to_time.utc if !start_date_utc.present?
                                  end_date_utc = Date.today.to_time.utc if !end_date_utc.present?
                                  any_of({:created_at.gte => start_date_utc, :created_at.lte => end_date_utc}, 
                                         {:pickup_date.gte => start_date_utc, :pickup_date.lte => end_date_utc}, 
                                         {:desired_arrival_date.gte => start_date_utc, :desired_arrival_date.lte => end_date_utc}).
                                  where(:state.in => ["accepted"], :state.nin => ["delivered"]).without(:carrier_digest, :carrier_label_image_base64, :carrier_label_html_base64)
                                }

scope :search, Proc.new{|search_params| 
                    regexp = Regexp.new(/.*#{search_params.strip}.*/i, true)
                    where(:golfer_name => regexp)
                  }

これはうまく機能し、それらを単独で使用すると期待値を返すようですが、スコープチェーンを使用するとめちゃくちゃになります。

たとえば、実行するModel.undelivered_shipments.search("sid")と、最初のパラメーターとして :ids を持つ配列が取得されます


[:ids, #[{:created_at=>{"$gte"=>Thu Sep 27 18:30:00 UTC 2012, "$lte"=>Thu Oct 04 18:30:00 UTC 2012}}, {:pickup_date=>{"$gte"=>Thu Sep 27 18:30:00 UTC 2012, "$lte"=>Thu Oct 04 18:30:00 UTC 2012}}, {:desired_arrival_date=>{"$gte"=>Thu Sep 27 18:30:00 UTC 2012, "$lte"=>Thu Oct 04 18:30:00 UTC 2012}}], :_id=>"sid", :state=>{"$nin"=>["delivered"], "$in"=>["accepted"]}},
  options:  {:fields=>{:carrier_digest=>0, :carrier_label_html_base64=>0, :carrier_label_image_base64=>0}},
  class:    Shipment,
  embedded: false>
]

なぜこれが返されるのか、なぜモンゴイド基準が定義されるのかはわかりませんが、メソッドの前に:_id => 'sid'実行すると、基準が正しく生成されます。searchundelivered_shipments

などの他のスコープで実行すると機能しますfor_pickups.searchが、未配達の出荷では機能しません。何かが足りないことは理解していますが、ドキュメントを調べたところ、本当に役立つものは見つかりませんでした。これについて何か助けていただければ幸いです

前もって感謝します。

4

0 に答える 0