index - Rails 3/Ruby: ActiveRecord Find method IN condition Array to Parameters problema de cita única
ruby slice (2)
Creé un método en un modelo de micropost que toma una matriz de user_ids. En este método, utilizo el siguiente método ''buscar'' para extraer todas las publicaciones para todos los usuarios dentro de la matriz.
find(:all, :conditions => ["user_id IN (?)", args.join('','')])
Pero cuando ActiveRecord genera el SQL para esta consulta, rodea la lista delimitada por coma de Ids en comillas simples. Esto hace que la consulta solo saque publicaciones para el primer número dentro de las comillas simples en lugar de todos los números.
SELECT `microposts`.* FROM `microposts` WHERE (user_id IN (''3,4,5'')) ORDER BY microposts.created_at DESC
La consulta debería verse así para que funcione correctamente, pero no sé cómo hacer para que Ruby convierta la matriz en una lista delimitada por coma sin las comillas, sé que tiene que ser algo simple y solo me la estoy perdiendo y puedo '' t encuentra algo en Google que corrige esto. Todas las publicaciones que he encontrado usan el mismo método .join ('','') para concertar la matriz.
SELECT `microposts`.* FROM `microposts` WHERE (user_id IN (3,4,5)) ORDER BY microposts.created_at DESC
Un hecho más que podría ayudarlo a resolver mi problema es que la matriz de identificadores que paso a través del método se está construyendo de la siguiente manera. No estoy seguro si esto afectaría las cosas.
ids = Array.new
ids.push(current_user.id)
ids = ids + current_user.friends.map(&:id)
ids = ids + current_user.reverse_friends.map(&:id)
Gracias de antemano a quien puede ayudarme a volver al trabajo;)
En los rieles 3 y 4, también podría simplemente pasar el conjunto como un argumento como ese:
Post.where(:user_id => [1,2,3])
Y eso le dará el mismo resultado que
Post.where("user_id IN (?)", [1,2,3])
Respuesta actualizada (dos veces) para reflejar la sintaxis de ActiveRecord de Rails 3+
Rieles 3+
Puede usar la siguiente sintaxis:
Post.where(user_id: [1,2,3])
Y por lo tanto:
Post.where(user_id: args)
Rieles 3 o Rieles 4 (Original)
Para completar, la sintaxis de Rails 3 sería:
Post.where("user_id IN (?)", [1,2,3]).to_a
Si args es una Array
, entonces:
Post.where("user_id IN (?)", args).to_a
O bien, si args es una matriz de cadenas:
Post.where("user_id IN (?)", args.map(&:to_i)).to_a
El to_a
es opcional, pero devolverá los resultados como una matriz. Espero que esto ayude.
Carriles 2
Debería poder simplemente pasar una matriz como parámetro, de la siguiente manera:
find(:all, :conditions => ["user_id IN (?)", [1,2,3] ] )
Por lo tanto, si args es una matriz de identificadores, simplemente debes llamar a:
find(:all, :conditions => ["user_id IN (?)", args ] )
En caso de que tenga problemas con los tipos, puede hacer:
find(:all, :conditions => ["user_id IN (?)", args.map { |v| v.to_i } ] )
y esto asegurará que cada elemento en la matriz sea un Entero.