ActiveRecord znajduje i zwraca tylko wybrane kolumny


89

edytuj 2

Jeśli się na to natkniesz, sprawdź obie odpowiedzi, ponieważ teraz użyłbym do tego skubania


Mam dość duży niestandardowy zestaw danych, który chciałbym powrócić, aby wyświetlić go jako json. Jedna część to:

l=Location.find(row.id)
tmp[row.id]=l

ale chciałbym zrobić coś takiego:

l=Location.find(row.id).select("name, website, city")
tmp[row.id]=l

ale to nie wydaje się działać. Jak mam to zrobić?

dzięki

edit 1
Alternatywnie, czy istnieje sposób, w jaki mogę przekazać tablicę tylko atrybutów, które chcę uwzględnić?

Odpowiedzi:


86

W Railsach 2

l = Location.find(:id => id, :select => "name, website, city", :limit => 1)

...lub...

l = Location.find_by_sql(:conditions => ["SELECT name, website, city FROM locations WHERE id = ? LIMIT 1", id])

Ten dokument referencyjny zawiera całą listę opcji, z którymi możesz korzystać .find, w tym sposoby ograniczania za pomocą numeru, identyfikatora lub dowolnej innej dowolnej kolumny / ograniczenia.

W Railsach 3 z interfejsem zapytań ActiveRecord

l = Location.where(["id = ?", id]).select("name, website, city").first

Ref: Interfejs zapytań Active Record

Możesz także zamienić kolejność tych połączonych wywołań, robiąc .select(...).where(...).first- wszystko, co robią, to konstruowanie zapytania SQL, a następnie wysyłanie go.


ale chcę tylko jednej instancji nie wszystkich
timpone

Zmieniłem odpowiedź. :limitpowinien to zrobić, lub :firstlub :lastcokolwiek, w zależności od tego, czego chcesz. W dokumencie referencyjnym, do którego utworzyłem łącze, dowiesz się, jak to wszystko zrobić.
jefflunt

Zaktualizowano o sposób wykonywania równoważnego zapytania w Railsach 3.
jefflunt

205

oskubać (nazwa_kolumny)

Ta metoda jest przeznaczona do wybierania przez jedną kolumnę jako bezpośrednie zapytanie SQL. Zwraca tablicę z wartościami o określonej nazwie kolumny. Wartości mają ten sam typ danych co kolumna.

Przykłady:

Person.pluck(:id) # SELECT people.id FROM people
Person.uniq.pluck(:role) # SELECT DISTINCT role FROM people
Person.where(:confirmed => true).limit(5).pluck(:id)

zobacz http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck

Wprowadzono szyny od 3.2 i akceptuje tylko jedną kolumnę. W szynach 4 akceptuje wiele kolumn


1
OK, skubanie z wieloma kolumnami jest niesamowite… właśnie dowiedziałem się tego w odpowiedzi. Rails 3 wymaga jednak zaakceptowanej odpowiedzi.
Jay Shepherd

Przyjęta odpowiedź jest prawidłowa, ponieważ skubanie nie było wtedy dostępne.
prasad.surase

User.pluck (: email,: id) WYBIERZ "users". "Email", "users". "Id" FROM "users"
pranav prashant

2
Model.uniq to teraz Model.distinct (przynajmniej w Railsach 5).
mrturtle

Wygląda na to, że możesz wykonać następujące czynności w Location.select([:name, :website, :city])
railsach

24

Moja odpowiedź przychodzi dość późno, ponieważ jestem całkiem nowym programistą. Oto, co możesz zrobić:

Location.select(:name, :website, :city).find(row.id)

Przy okazji, to jest Rails 4


To powinna być wybrana odpowiedź i jak najbardziej bezpośrednio odpowiada na pytanie.
Michael Wiltbank
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.