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ć?

timpone
źródło

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.

jefflunt
źródło
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

prasad.surase
źródło
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

tkhuynh
źródło
To powinna być wybrana odpowiedź i jak najbardziej bezpośrednio odpowiada na pytanie.
Michael Wiltbank