2016-07-21 12 views
3

Ich habe zwei Modelle Benutzer und Buch. Benutzer haben Benutzername und E-Mail-Feld, Buch haben Autor und Titelfeld. Wenn ich verwende verbindet die Benutzer zu erhalten, basierend auf Daten, die mit übergeben Bedingungen in where-Klausel, erhalte ich unterschiedliche ErgebnisseWas ist der Unterschied zwischen der Übergabe eines Symbols und Zeichenfolge in Where-Klausel mit Joins

  1. Als ich das laufen

    User.joins(:books).where('author = ? ','xxxx') 
    

Mysql-Abfrage generiert wird :

"SELECT `users`.* FROM `users` INNER JOIN `books` ON `books`.`user_id` = `users`.`id` WHERE (author = 'xxxxx')" 

gibt mir den Benutzer, dessen Buch enthalten xxxx Autor während

  1. Wenn ich laufen diese

    User.joins(:books).where(author: 'xxxx') 
    

Mysql-Abfrage generiert wird:

"SELECT `users`.* FROM `users` INNER JOIN `books` ON `books`.`user_id` = `users`.`id` WHERE `users`.`author` = 'xxxx'"> 

gibt mysql2 :: Fehler: Unbekannte Spalte ‚Benutzer. Autor 'in' wo Klausel ':

SELECT `users`.* FROM `users` INNER JOIN `books` ON `books`.`user_id` = `users`.`id` WHERE `users`.`author` = 'xxxx' 

ActiveRecord :: StatementInvalid: Mysql2 :: Fehler: Unbekannte Spalte 'users.author' in 'Where-Klausel': SELECT users. * Von users INNER JOIN book ON book. user_id = users. id WHERE users. author = ‚Dan Brown‘

Meine Frage: ist, wenn ich einen String verkapselt Feld und Wert am Übergang in where-Klausel gibt es mir führen, aber wenn ich pass ein Symbol in where-Klausel gibt es mir unbekannte Spalte Fehler MySQL. Also, woher weiß Ruby-Interpreter, woher Daten in Symbol Passing und String-Passing zu holen

Antwort

3

Wenn wir die Tische speziell in Schienen verbinden, kann die Schiene das Aliasing der verbundenen Tabellen übernehmen.

Ihre Anfrage, User.joins(:books).where(author: 'xxxx') sucht nach dem Autorenfeld in der Benutzertabelle

User.joins(:books).where(author: 'xxxx')nimmt immer das Feld der ersten Tabelle und

User.joins(:books).where('author = ? ','xxxx')sucht in beiden Tabellen

Zum Beispiel User.joins(:books).where('id = ? ','xxxx'), versuchen Sie diese Abfrage.

In der oben Sie erhalten eine Fehlermeldung erhalten, weil id Feld in beiden Tabellen vorhanden ist, und es wird

verwirrt, aber,

User.joins(:books).where(id: 'xxxx')funktioniert, weil es nur in der Benutzer-Tabelle durchsucht.

so können Sie verwenden, finden Autor durch Bücherbooks: {author: 'xxxx'}

User.joins(:books).where(books: {author: 'xxxx'}) // your required query 

oder

User.joins(:books).where('author = ? ','xxxx') 
+0

Danke für die Antwort @Sravan. Aber meine Frage ist, wie Rails entscheiden, wenn String übergeben, um nach Autor in Buch-Tabelle zu suchen, während beim Übergeben von Symbol entscheidet, in Benutzern Tabelle – Gagan

+1

zu suchen Ich aktualisierte meine Antwort bitte einmal überprüfen. – Sravan

-1

User.joins(:books).where('author = ? ','xxxx') ist frei von SQL-Injektion, aber User.joins(:books).where(author: 'xxxx') ist nicht.

Es ist gut, User.joins(:books).where('author = ? ','xxxx') zu verwenden, da es einfacher ist, komplexere where-Klausel zu schreiben.

Wenn Sie User.joins(:books).where(author: 'xxxx') Schienen schreiben Dolmetscher werden versuchen, so users.author zu interpretieren = ‚xxxx‘

Sie die link für weitere Informationen überprüfen.

+0

Danke für die Antwort @Sabyasachi. Aber meine Frage ist, wie Rails entscheiden, wenn String übergeben, um nach Autor in Bücher Tabelle zu suchen, während beim Übergeben von Symbol entscheidet, in Benutzern Tabelle – Gagan

+0

zu suchen, könnten Sie genauer ausführen, wo. (Autor: 'xxx') 'ist anfällig für SQL-Injektion? –

+0

Wie es nicht frei von SQL-Injektion ist User.joins (: Bücher) .where (Autor: 'xxxx')? –