嗨,我有运行在 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.search
etc)运行它,它可以工作,但不适用于未交付的货物。我知道我遗漏了一些东西,但我浏览了文档,但找不到任何真正有帮助的东西。我真的很感激这方面的任何帮助
提前致谢。