2012-05-19 14 views
5

Kiedy jestem w Rails 3.2 konsola, mogę to zrobić dobrze:Szyny ActiveRecord znaleźć w konsoli

p = Person.last 
p.last_name 

i drukuje nazwisko.

Ale gdy próbuję go znaleźć przez id, to jest w stanie zlokalizować jednego rekord i przechowywać je w moim zmiennej p, ale nie mogę drukować kolumnę last_name . Na przykład:

p = Person.where(id: 34).limit(1) 

drukowania p tutaj pokazuje wszystkie kolumny ale p.last_name mówi to

NoMethodError: undefined method `last_name' for 
#<ActiveRecord::Relation:0x000000055f8840> 

Każda pomoc będzie mile widziane.

Odpowiedz

9

Zapytanie zostanie zwrócony ActiveRecord::Relation, który działa jak tablica, nawet jeśli ograniczyć liczbę zwracanych rekordów.

Jeśli zamiast zmienić zapytanie do:

p = Person.where(id: 34).first 

to będzie działać jak chcesz, i arel wie automatycznie ograniczyć zapytanie do jednego wyniku, więc nie trzeba jawnie określić limit(1).

Można także zmienić albo

p = Person.find(34) # Throws an ActiveRecord::RecordNotFound exception if Person with id 34 does not exist 

lub

p = Person.find_by_id(34) # Returns nil if Person with id 34 does not exist. Does *not* throw an exception. 

i zwróci pojedynczy rekord, jak oczekiwano.

EDYCJA: A gdzie zapytanie zwraca ActiveRecord :: Relation, jako @mu is too short wspomniana w komentarzach.

+0

Tak, prawda, ale nie chciałem dalej mylić sytuacji. – x1a4

+0

p = Person.find_by_id (34) dla wygranej. Dzięki. –

1

Co jesteś prawdopodobnie rzeczywiście szukasz

@person = Person.find(34) 
@person.last_name 
3

Zwraca kolekcję aktywnych obiektów rekord:

p = Person.where(id: 34).limit(1) 

Ale jest tylko jeden z id = 34, więc jest to zbiór 1 .

sposobem na to jest:

p = Person.where(id: 34).limit(1).first 

albo lepiej:

p = Person.where(id: 34).first 

albo jeszcze lepiej:

p = Person.find(34) 
0

w Twoim przypadku osoba jest klasa i to jest dziedziczona z ApplicationRecord

p = Person.where(id:10).limit(1) 

Zwraca tylko wynik zapytania, a nie obiektu.

Można to sprawdzić za pomocą

p.class # => It reurns Nilclass which means its not at all a class 

Nie można więc używać p.last_name lub p.first_name na str.

Powiązane problemy