0

Mongoid で書かれたクエリがあります

@result = User.find(:name=>"xxxxx").limit(5) 

そして、jsonのデータを次のように返します

render :json =>@result.to_json() 

ここで、名前がxxxxxであるユーザーの総数を変数に追加します@result。私はいくつかのことを試しましたが、何もうまくいきませんでした

@new_result ={:result =>@result, :count=>@result.length} 

render :json =>@new_result.to_json() 

出力は

[{new_result:null,count:25}] 

基本的にはカウントを取得できますが、そのカウントを @result に追加することはできません。これを機能させる方法はありますか。

4

1 に答える 1

1

穏やかなリマインダー:

All queries in Mongoid are Criteria, which is a chainable and lazily evaluated wrapper to a MongoDB dynamic query.

参照: http: //mongoid.org/en/mongoid/docs/querying.html#query_plus

Mongoid Criteriaが遅延評価されることを理解してください。そうしないと、混乱が生じ、時間と時間がかかります...

@result = User.find(:name => "xxxxx")。limit(5)を実行すると、Mongoid :: Errors::DocumentNotFound例外が発生します。これはMongoid2.4.10の場合です。あなたの質問は正確ですか?

これをUser.whereに変更しました。@result= User.find(:name => "xxxxx")。limit(5)はCriteriaであり、(まだ)MongoDBから読み取られたUserインスタンスではありません。

次のテストは、遅延評価のために、DBクエリが必要な場合にのみ発生することを明確にするのに役立ちます。たとえば、メソッドto_jsonとメソッドの長さの後などです。また、ログを調整し、to_jsonまたはlengthメソッドで@resultを使用するたびに、DBクエリが繰り返されることに注意してください。これは非効率的で、おそらく意図したものではありません。Enumerable#to_aやEnumerable#eachなどのメソッドを使用して、評価とフェッチを強制できます。

test / unit / user_test.db

require 'test_helper'

class UserTest < ActiveSupport::TestCase
  def setup
    User.delete_all
  end

  test "mongoid lazy eval" do
    User.create(name: 'xxxxx')
    assert_equal(1, User.count)
    puts "User.all.to_a: #{User.all.to_a.inspect}"
    assert_raises Mongoid::Errors::DocumentNotFound do
      @result = User.find(:name=>"xxxxx").limit(5)
    end
    puts "@result = User.find(:name=>\"xxxxx\").limit(5); @result: #{@result.inspect}"
    @result = User.where(:name=>"xxxxx").limit(5)
    puts "@result = User.where(:name=>\"xxxxx\").limit(5); @result.class: #{@result.class}"
    puts "@result.to_json: #{@result.to_json}"
    puts "@result.length: #{@result.length}"
    @new_result ={:result =>@result, :count=>@result.length}
    puts "@new_result: #{@new_result.inspect}"
    puts "@new_result.to_json: #{@new_result.to_json}"
  end
end

テスト出力

Run options: --name=test_mongoid_lazy_eval

# Running tests:

User.all.to_a: [#<User _id: 4fca03e7e4d30b1e42000001, _type: nil, name: "xxxxx">]
@result = User.find(:name=>"xxxxx").limit(5); @result: nil
@result = User.where(:name=>"xxxxx").limit(5); @result.class: Mongoid::Criteria
@result.to_json: [{"_id":"4fca03e7e4d30b1e42000001","name":"xxxxx"}]
@result.length: 1
@new_result: {:result=>#<Mongoid::Criteria
  selector: {:name=>"xxxxx"},
  options:  {:limit=>5},
  class:    User,
  embedded: false>
, :count=>1}
@new_result.to_json: {"result":[{"_id":"4fca03e7e4d30b1e42000001","name":"xxxxx"}],"count":1}
.

Finished tests in 0.038161s, 26.2048 tests/s, 52.4095 assertions/s.

1 tests, 2 assertions, 0 failures, 0 errors, 0 skips
于 2012-06-02T12:29:31.080 に答える