2012-03-26 9 views
6

Estoy trabajando en raíles 3 y sqlite db. Usando una consulta IN. Actualmente pasando una variable de cadena de elementos a consulta IN. Pero al ejecutar esa consulta se necesita '' para que no funcione. ¿Cómo superar esta situación?Cómo pasar datos a la consulta IN en raíles 3

Aquí está mi código

items = "" 
items << "#{@invitation_user1.id}" << "," << "#{@invitation_user2.id}" << "," << "#{@user1.id}" << "," << "#{@user2.id}" << "," << "#{@user2.id}" << "," << "#{@profile1.id}" << "," << "#{@profile2.id}" 
@activities = Version.where("item_id IN (?)","#{items}") 

items.to_i intentado, items.to_s pero no funcionó. En el registro puedo ver esto.

SELECT "versions".* FROM "versions" WHERE (item_id IN ('19,20,4,1,1,4,1')) 

Pero todo lo que necesito es

SELECT "versions".* FROM "versions" WHERE (item_id IN (19,20,4,1,1,4,1)) 

Respuesta

22

Puede simplemente pasa una matriz en Rails es lo suficientemente inteligente como para que lo correcto con él:.

items = [ 
    @invitation_user1.id, 
    @invitation_user2.id, 
    @user1.id, 
    @user2.id, 
    @profile1.id, 
    @profile2.id 
] 

@activities = Version.where("item_id IN (?)", items) 
# or equivalently: 
@activities = Version.where(:item_id => items) 

Esto se prefiere enormemente en su variante, como carriles maneja adecuadamente escapar de todo pasado valores para el adaptador de base de datos usado.

1

Uso matriz en lugar de cadena.

Por ejemplo

ids = [ @invitation_user1.id, @invitation_user2.id, @user1.id, @user2.id ] 

Entonces fácilmente se pueden encontrar los registros de

@versions = Version.find_all_by_id(ids) 

Esto dará lugar a la consulta que se esperaba.

SELECT "versions".* FROM "versions" WHERE (item_id IN (19,20,4,1)) 
1

Lo que se busca es split:

[1] pry(main)> a = '19,20,4,1,1,4,1' 
=> "19,20,4,1,1,4,1" 
[2] pry(main)> a.split(',') 
=> ["19", "20", "4", "1", "1", "4", "1"] 
[3] pry(main)> a.split(',').map(&:to_i) 
=> [19, 20, 4, 1, 1, 4, 1] 

Pero, como usted está construyendo la 'cadena' de forma manual, mejor usar una matriz:

items = Array.new 
items << @invitation_user1.id << @invitation_user2.id << @user1.id 
items << @user2.id << @user2.id << @profile1.id << @profile2.id 
@activities = Version.where(item_id: items) 

De todas formas, la manera de conseguir los identificadores son extraños porque ... ¿qué pasaría si agregaras más usuarios? o perfiles?

Lo que yo haría (ver tan poco como podemos ver en el ejemplo)

items = Array.new 
items << get_invitation_user_ids 
items << get_user_ids 
items << get_profile_ids 
@activities = Version.where(item_id: items) 

y posteriormente definir los métodos, como en:

def get_invitation_user_ids 
    InvitationUser.select(:id).map(&:id) 
end 

... 
Cuestiones relacionadas