1

嗨,我有运行在 Ruby 1.8.7 上的应用程序(我目前无法将其更新到 1.9.2)和运行 mongoid 2.2.2 的 Rails 3.0.9。

我有几个命名范围,我定义如下



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>
]

不知道为什么它会返回这个以及为什么定义 mongoid 标准:_id => 'sid'但是当我search在方法之前运行它时undelivered_shipments,它会正确生成标准。

如果使用其他范围(如for_pickups.searchetc)运行它,它可以工作,但不适用于未交付的货物。我知道我遗漏了一些东西,但我浏览了文档,但找不到任何真正有帮助的东西。我真的很感激这方面的任何帮助

提前致谢。

4

0 回答 0