ActiveRecord encontra e retorna apenas colunas selecionadas

88

editar 2

Se você se deparar com isso, verifique ambas as respostas, pois agora eu usaria arrancar para este


Tenho um conjunto de dados personalizado bastante grande que gostaria de retornar para ser exibido como json. Uma parte é:

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

mas eu gostaria de fazer algo como:

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

mas isso não parece estar funcionando. Como eu faria isso funcionar?

THX

editar 1
alternativamente, há uma maneira de passar um array apenas dos atributos que desejo incluir?

timpone
fonte

Respostas:

85

No Rails 2

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

...ou...

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

Este documento de referência fornece a lista completa de opções com as .findquais você pode usar , incluindo como limitar por número, id ou qualquer outra coluna / restrição arbitrária.

No Rails 3 com interface de consulta ActiveRecord

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

Ref: Interface de consulta do Active Record

Você também pode trocar a ordem dessas chamadas encadeadas, fazendo .select(...).where(...).first- tudo que essas chamadas fazem é construir a consulta SQL e, em seguida, enviá-la.

Jefflunt
fonte
mas eu quero apenas uma única instância, não toda
timpone
Eu editei minha resposta. :limitdeve fazer isso, ou :firstou :lastou o que quer, dependendo do que você quiser. O documento de referência que vinculei dirá a você como fazer tudo isso.
jefflunt
Atualizado para incluir como fazer uma consulta equivalente no Rails 3.
jefflunt
205

arrancar (column_name)

Este método foi desenvolvido para realizar a seleção por uma única coluna como consulta SQL direta. Retorna Array com valores do nome da coluna especificada. Os valores têm o mesmo tipo de dados da coluna.

Exemplos:

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)

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

Seus trilhos introduzidos 3.2 em diante e aceita apenas uma coluna. No trilho 4, ele aceita várias colunas

prasad.surase
fonte
1
OK, arrancar com várias colunas é incrível .. acabei de aprender isso nesta resposta. Rails 3, entretanto, precisa da resposta aceita.
Jay Shepherd
A resposta aceita é a correta, porque a coragem não estava disponível na época.
prasad.surase
User.pluck (: email,: id) SELECIONE "usuários". "Email", "usuários". "Id" DE "usuários"
pranav prashant
2
Model.uniq agora é Model.distinct (pelo menos no Rails 5).
mrturtle
Parece que você pode fazer o seguinte no rails 3.2: Location.select([:name, :website, :city])se você passar uma matriz
CTS_AE
22

Minha resposta chega tarde porque sou um desenvolvedor muito novo. Isso é o que você pode fazer:

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

A propósito, este é o Rails 4

tkhuynh
fonte
Esta deve ser a resposta selecionada e responder mais diretamente à pergunta.
Michael Wiltbank