0

我在代码中偶然发现了这个:

当我在 Rails 中使用 MongoMapper 编写查询时,如下所示:

@res = 客户。哪里({$foo, $bar})

然后我运行@res.inspect - 我得到:

@res is #<MongoMapper::Plugins::Querying::DecoratedPluckyQuery merchant_id: "518b762e89651a0389000013", phone: "**********", transformer: #<Proc:0x007fde074078a0@/usr/local/rvm/gems/ruby-2.0.0-p247/gems/mongo_mapper-0.13.0.beta1/lib/mongo_mapper/plugins/querying.rb:66 (lambda)>>

Ergo - 我的变量是实际的查询字符串。

当我这样改变它时:

@res = 客户。全部({$foo, $bar})

然后@res.inspect - 我得到:

@res is [#<Customer _id: BSON::ObjectId('51a9806589651a05da000001'), account_id: "", admin_id: nil, city_id: "Kailua, Hawaii", company_id: "0", created_at: Sat, 11 May 2013 00:00:00 UTC +00:00, cust_notes: "", datecreated: 2013-01-06 00:00:00 UTC, datemodified: 2013-01-06 00:00:00 UTC, **REMOVED PRIVATE DATA HERE** type: "customer", updated_at: Sun, 15 Sep 2013 22:43:56 UTC +00:00, zip_code: *****>]

Ergo - 它实际上是查询的结果(这是我一直期望的)。

现在奇怪的是,这里的具体区别是我没有做“respond_to do |format|” 而且我没有在视图中访问@res - 我试图查看它的结果仍然在控制器中以用于重定向目的。

因为绝对在我的应用程序的其他任何地方我都在做同样的“Customer.where”或“Job.where”的东西,然后那个实例变量被扔到视图上,我会做类似@customer.name 或其他的事情从数组中获取值。

为什么

4

1 回答 1

1

我知道这已经有几个月了,但我想我会做出回应,以防其他人偶然发现同样的问题。

WHERE 返回一个 Plucky::Query 而不是结果,因此您可以在执行实际查询之前为其添加额外的功能。

@johns = Customer.where(name: 'john').fields(:foo).limit(10).sort(:foo).all

您还可以传递查询以对其执行其他 WHERE 过滤,然后最终使用all, first,each等执行它。

@johns_older_than_10 = filter_by_age(Customer.where(name: 'john')).all

def filter_by_age(query)
  query.where(age: { :$gt => 10 })
end

请注意,all如果您使用each.

于 2014-01-03T15:25:53.887 回答