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?

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.


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


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


Esta deve ser a resposta selecionada e responder mais diretamente à pergunta.
Michael Wiltbank
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.