6

W mojej aplikacji rails (v: 3.1) wdrożonej na Heroku otrzymuję więcej obiektów o tym samym ID w pamięci. mój log konsoli heroku:Więcej obiektów w pamięci o tym samym id?

>> Project.find_all_by_id(92).size 
=> 2 
>> ActiveRecord::Base.connection.execute('select * from projects where id=92').to_a.size 
=> 1 

Jak to jest możliwe? Jaki może być problem?

+0

Czy możesz również opublikować wygenerowane instrukcje SQL? – rocketscientist

+1

Więcej diagnostyki, którą możesz opublikować, co pomoże ci zawęzić: 'Project.find_all_by_id (92) .method (: size) .source_location' (Czy coś nadpisało .size?) I' Project.find_all_by_id (92) .to_a.size' (Czy działa, gdy nie jest stowarzyszeniem?). –

Odpowiedz

1

Rozwiązanie

najwyraźniej nie ma duplikat wpisu w bazie danych zgodnie z zapytania SQL.

Może rozmiar lub długość metoda w twojej klasie Projekt został nadpisany. Próbowałem find_all_by_id i wydaje się, że zapytanie SQL jest poprawne.

1.9.2-p180 :006 > Script.find_all_by_id(1).size 
    Script Load (0.7ms) SELECT "scripts".* FROM "scripts" WHERE "scripts"."id" = 1 
=> 1 

Podpowiedź

Jeśli chcesz liczyć rekordy należy zrobić w ten sposób

Script.where(id: 1).size 
    (0.8ms) SELECT COUNT(*) FROM "scripts" WHERE "scripts"."id" = 1 
=> 1 

Ponieważ, jak widać, liczenie odbywa się poprzez bazy danych i nie przez sam ruby. Przez kilkanaście wierszy nie będzie widać różnicy, ale jeśli masz tysiące lub miliony ...

+0

Tak, założę się, że masz kolumnę o nazwie "size" w tabeli projektów, lub jakiś inteligentny facet napisał: 'def rozmiar; to_do_items.count; koniec "lub podobny. :-) –

+0

@ Irongaze.com Kolumna o nazwie "rozmiar" może być możliwością ... Nie myślałem o tym. :) – basgys

0
irb(main):023:0> ActiveRecord::Base.connection.execute('select count(*) from users where address_id = 22').fetch_hash 
=> {"count(*)"=>"4"} 
irb(main):024:0> User.find_all_by_address_id(22).size 
=> 4 

to lepiej dokument przeglądową o Mysql :: Wynik pierwszy

http://rubydoc.info/gems/mysql/2.8.1/frames

Powiązane problemy