Adăugați date externe la variabila instanță în ROR

Am o interogare scrisă în Mongoid

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

și retur datele în json ca

render :json =>@result.to_json() 

Acum vreau să adăugați numărul total al utilizatorilor ale căror nume sunt xxxxx în variabila @result . Am incercat cateva lucruri, dar nimic nu a functionat ex

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

și

render :json =>@new_result.to_json() 

ieșirea este

[{new_result:null,count:25}] 

Practic eu sunt în măsură să obțină contele, dar eu nu sunt în măsură să adăugați că numărătoarea mea @result. Există o modalitate de a face acest lucru.

0
Am o ieșire neașteptată [{new_result: null, count: 25}]
adăugat autor Abhay Kumar, sursa
Aceasta funcționează lungime = {'count' => @ result.length} --- @ new_result = @ rezultat << lungime --- render: json => (@ new_result) .to_json ()
adăugat autor Abhay Kumar, sursa
Merge pentru mine. Nu văd nici o problemă.
adăugat autor Chamnap, sursa

1 răspunsuri

Un memento blând:

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

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

Asigurați-vă că înțelegeți că criteriile Mongoid sunt evaluate leneș, altfel vă va provoca confuzie și vă costă timp, și mai mult timp ...

When I run your @result = User.find(:name=>"xxxxx").limit(5), I get a Mongoid::Errors::DocumentNotFound exception, this is with Mongoid 2.4.10. Are you sure that your question is accurate?

I've changed it to User.where, and @result = User.find(:name=>"xxxxx").limit(5) is a Criteria, not (yet) a User instance read from MongoDB.

Următorul test ar trebui să vă ajute să clarificați faptul că, datorită evaluării leneșe, interogarea DB apare numai atunci când este necesară, de exemplu, după metoda to_json și lungimea metodei. De asemenea, coada jurnalul dvs., și rețineți că fiecare utilizare a @result cu o metodă to_json sau lungime duce la o interogare DB repetată, care este ineficientă și probabil nu ceea ce ați intenționat. Puteți forța o evaluare și să o preluați utilizând metode precum Enumerable # to_a sau Enumerable # each.

testare/unitate/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

ieșire de ieșire

Run options: --name=test_mongoid_lazy_eval

# Running tests:

User.all.to_a: [#]
@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=>#"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
1
adăugat
JavaScript, România - Moldova
JavaScript, România - Moldova
328 participanți

Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @node_ro, @php_ro, @python_ro, @seo_ro, @RomaniaGroup, @ai_ro, @Grupuri_IT Offtop: @holywars_ro Joburi: @js_jobs_ro Sponsored with ❤️ by ciupacabra.com