2012-03-26 9 views
6

Ich arbeite auf Schienen 3 und SQLite db. Verwenden einer IN-Abfrage. Übergibt derzeit eine String-Variable von Elementen an die IN-Abfrage. Aber während der Ausführung dieser Abfrage dauert es "", so dass es nicht funktioniert. Wie komme ich über diese Situation?Wie Daten an IN-Abfrage in Schienen 3 übergeben werden

Hier ist mein Code

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 Versuchte, items.to_s aber hat nicht funktioniert. Im log kann ich das sehen.

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

Aber alles was ich brauche ist

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

Antwort

22

Sie können einfach in ein Array übergeben Rails ist klug genug, um auf die richtige Sache mit ihm.

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) 

Diese erheblich über Ihre Variante bevorzugt, da Rails richtig Griffe aller bestanden Flucht Werte für den verwendeten Datenbankadapter.

1

Verwenden Array statt String.

Zum Beispiel

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

Dann einfach können Sie die Datensätze finden, indem

@versions = Version.find_all_by_id(ids) 

die Abfrage Dies führt Sie erwartet.

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

Was Sie suchen ist 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] 

Aber, wie Sie die 'string' manuell konstruieren, besser ein Array zu verwenden:

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) 

Wie auch immer, auf die Art und Weise zu erhalten Die IDs sind seltsam, weil ... was passiert, wenn Sie mehr Benutzer hinzufügen? oder Profile?

Was ich tun würde (da wenig wie wir in Ihrem Beispiel sehen)

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

und später diese Methoden definieren, wie in:

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

... 
Verwandte Themen