こんにちは、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'
実行すると、基準が正しく生成されます。search
undelivered_shipments
などの他のスコープで実行すると機能しますfor_pickups.search
が、未配達の出荷では機能しません。何かが足りないことは理解していますが、ドキュメントを調べたところ、本当に役立つものは見つかりませんでした。これについて何か助けていただければ幸いです
前もって感謝します。