Rieles, Activerecord, ID de consulta en la matriz de INTS, mantenga orden de matriz aprobada -- ruby-on-rails campo con ruby-on-rails-4 camp Relacionados El problema

Rails, ActiveRecord, query id in array of ints, keep order of passed array


22
vote

problema

Español

Estoy pensando en la mejor solución para un problema. Digamos que tenemos una lista de las ID del modelo Activerecord:

  ids = [1, 100, 5, 30, 4, 2, 88, 44]   

Entonces me gustaría hacer una consulta que selecciona a todos los usuarios, por ejemplo, con IDS de la lista, pero para mantener el pedido. Si lo hago

  User.where(id: ids)   

La respuesta será una lista de usuarios con ASC PEDIDO por ID, pero quiero que el pedido sea el mismo que en la matriz.

¿Qué crees que es la mejor solución aquí? Seleccione todos los usuarios y luego para manipular la lista de objetos ActiverCord? Tal vez haya una forma más inteligente de hacer eso.

¡Gracias!

Original en ingles

I am thinking about the best solution for a problem. Let's say that we have a list of ids of ActiveRecord model:

ids = [1, 100, 5, 30, 4, 2, 88, 44] 

Then I would like to make query that selects all users for example with ids from the list but to keep the order. If I do

User.where(id: ids) 

the response will be a list of users with asc order by id, but I want the order to be the same as in the array.

What do you think that it's the best solution here? Select all users and then to manipulate the list of ActiveRecord objects? Maybe there is a more clever way to do that.

Thanks!

     
   
   

Lista de respuestas

19
 
vote

Con referencia a aquí , para PostgreSQL,

  .attr('value')4  
 

With reference to here, for postgresql,

User.where(id: ids).order("position(id::text in '#{ids.join(',')}')") 
 
 
10
 
vote

Si está utilizando MySQL, puede usar FIELD a los resultados del pedido:

  class User < ActiveRecord::Base   def self.find_in_order(ids)     self.where(id: ids).order("FIELD(id, #{ids.join(',')})")   end end  User.find_in_order([1, 100, 5, 30, 4, 2, 88, 44])   
 

If you are using MySQL, you can use FIELD to order results:

class User < ActiveRecord::Base   def self.find_in_order(ids)     self.where(id: ids).order("FIELD(id, #{ids.join(',')})")   end end  User.find_in_order([1, 100, 5, 30, 4, 2, 88, 44]) 
 
 
9
 
vote

Considerar menos de MySQL y PostgreSQL, si tiene un tamaño pequeño de identificaciones,

  User.where(id: ids).sort_by { |u| ids.index(u.id) }   
 

regard less of MySQL and Postgresql, if you have a small size of ids,

User.where(id: ids).sort_by { |u| ids.index(u.id) } 
 
 
   
   
1
 
vote

Si está utilizando Postgres, puede usar intarray

  class User < ActiveRecord::Base   def self.find_in_order(ids)     self.where(id: ids).order("idx(array[#{ids.join(',')}], id)")   end end   

Usted debe iniciar el módulo primero

  CREATE EXTENSION intarray   
 

If you are using Postgres you can use intarray

class User < ActiveRecord::Base   def self.find_in_order(ids)     self.where(id: ids).order("idx(array[#{ids.join(',')}], id)")   end end 

you should init module first

CREATE EXTENSION intarray 
 
 
0
 
vote
  users_by_id = User.find(ids).index_by(&:id) # Gives you a hash indexed by ID ids.collect {|id| users_by_id[id] }   
 
users_by_id = User.find(ids).index_by(&:id) # Gives you a hash indexed by ID ids.collect {|id| users_by_id[id] } 
 
 
0
 
vote

Otra posibilidad para los postgres (9.4 o posterior):

  ordered_ids = [1, 100, 5, 30, 4, 2, 88, 44] User.joins("join unnest('{#{ordered_ids.join(',')}}'::int[]) WITH "             "ORDINALITY t(id, ord) USING (id)").reorder('t.ord')   

Observe que la reorden es extremadamente importante.

Solución basada en https://stackoverflow.com/a/35456954

 

Another possibility for Postgres (9.4 or later):

ordered_ids = [1, 100, 5, 30, 4, 2, 88, 44] User.joins("join unnest('{#{ordered_ids.join(',')}}'::int[]) WITH " \            "ORDINALITY t(id, ord) USING (id)").reorder('t.ord') 

Notice that the reorder is extremely important.

Solution based on https://stackoverflow.com/a/35456954

 
 
 
 
-1
 
vote

Si desea obtener un resultado del modelo :: ActiverCord_Relation

  order(Arel.sql("field(id, ids.join(', ') asc"))   

arel.sql se requiere para evitar el mensaje en el registro:

Método de consulta peligrosa (método cuyos argumentos se utilizan como SQL RAW) Llamado con argumento (s) no atributo

 

if you want to get a result of Model::ActiveRecord_Relation

order(Arel.sql("field(id, ids.join(', ') asc")) 

Arel.sql is required to prevent the message in log:

Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s)

 
 

Relacionados problema

0  ¿Cómo puedo obtener un controlador de rieles para ejecutar diferentes JavaScript cuando se llama desde diferentes páginas en mi aplicación?  ( How can i get a rails controller to execute different javascript when called fro ) 
En mi aplicación tengo sales_opportunities, éstos belong_to tanto a los usuarios (lo que la entrada del usuario a lo general), y también para las empresas (lo...

1  Rieles 4 - Geocoder golpeando el límite de consulta en la suite de prueba  ( Rails 4 geocoder hitting query limit in test suite ) 
Al ejecutar mi suite de prueba, aproximadamente la mitad del tiempo se irá en rojo porque estoy golpeando la geocodificación por segundo límite de consulta: ...

1  Cargar imagen sin ningún rieles de gemfile4  ( Upload image without any gemfile rails4 ) 
Soy nuevo en Ruby en los rieles. Trato de subir imágenes sin ningún gemfile. Estoy siguiendo http://guides.rubyonrails.org/form_helpers Aquí está mi archi...

1  Rieles: calcule el tiempo utilizando el identificador de tiempo almacenado en la base de datos como "cadena"  ( Rails calculate time using time identifier stored in database as string ) 
Me gustaría calcular fechas futuras como esta: Date.today + 1.year Date.today + 1.month Para determinar, si la fecha futura debe ser una month o One ...

0  Fatal: no se han encontrado índices en el archivo de configuración '/mypath/config/development.sphinx.conf'  ( Fatal no indexes found in config file mypath config development sphinx conf ) 
Entonces, estoy usando sphinx de pensamiento y el complemento de Heroku flying sphinx en la producción. Sin embargo, parece que estoy obteniendo el sigu...

0  Crea un objeto vacío y configura su atributo a algo  ( Create empty object and set its attribute to something ) 
Tengo una acción en mi controlador llamado msbuild MyProject.csproj 7 donde configuro una variable de instancia llamada msbuild MyProject.csproj 8 basado ...

0  NomethodError en Deviso [Registros y sesiones] Método indefinido `New 'para NIL: NilClass  ( Nomethoderror in devise registrations sessions undefined method new for ni ) 
Showing ...views/devise/sessions/new.html.erb where line #3 raised: undefined method `new' for nil:NilClass Extracted source (around line #3): <h2>Sign in<...

0  ¿Cómo puedo mejorar mi método "NewName"?  ( How can i improve my newname method ) 
Soy un estudiante y tengo la nota (sin explicación) que Mi siguiente código está molestado y puede ser mucho mejor. ¿Cómo mejoraría mi método controller#newn...

2  Los rieles después_create hacen un objeto relacionado  ( Rails after create make a related object ) 
Me gustaría crear una categoría predeterminada para cada usuario 's compañía , después de que cree uno. Elaborando, User has_many :companies Compa...

0  Atributos virtuales en rieles 4 de rieles 3  ( Virtual attributes in rails 4 from rails 3 ) 
Estoy creando una aplicación de Rails 4.10 y estoy usando código de My Rails 3.2 Aplicación. En esta aplicación obtuve un formulario en el que agrego un atrib...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos