2012-03-26 13 views
6

Sto lavorando su rails 3 e sqlite db. Utilizzo di una query IN. Attualmente passa una variabile stringa di elementi alla query IN. Ma durante l'esecuzione di quella query ci vuole "" quindi non funziona. Come superare questa situazione?Come passare i dati alla query IN nelle rotaie 3

Ecco il mio codice

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}") 

provato items.to_i, items.to_s ma non ha funzionato. Nel registro posso vedere questo.

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

Ma ho solo bisogno di

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

risposta

22

Si può solo passare un array in Rails è abbastanza intelligente per la cosa giusta con esso:.

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) 

Questo è di gran lunga preferibile rispetto la tua variante, come Rails gestisce correttamente la fuga di tutti i passati valori per l'adattatore del database utilizzato.

1

Uso matrice invece di corda.

Per esempio

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

Quindi facilmente si possono trovare i record

@versions = Version.find_all_by_id(ids) 

Questo sarà il risultato della query che vi aspettavate.

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

Quello che state cercando è 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] 

Ma, come si sta costruendo il 'stringa' manualmente, meglio usare un array:

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) 

In ogni caso, il modo per ottenere l'id è strano perché ... cosa succederebbe se aggiungessi più utenti? o profili?

Cosa avrei fatto (visto che poco come possiamo vedere nel tuo esempio)

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

e successivamente definire quei metodi, come in:

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

... 
Problemi correlati