通过在带有连接的where子句中传递符号和字符串之间的区别是什么

时间:2016-07-21 10:58:59

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我有两个型号User和Book。用户有用户名和电子邮件字段,Book有作者和标题字段。当我使用联接来获取基于相关数据的用户以及where子句中传递的条件时,我得到的结果不同

  1. 当我运行时

    User.joins(:books).where('author = ? ','xxxx')
    
  2. 生成的Mysql查询是:

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

    给了我的用户,其书籍包括xxxx作者,而

    1. 当我运行时

      User.joins(:books).where(author: 'xxxx')  
      
    2. 生成的Mysql查询是:

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

      给出Mysql2 ::错误:未知栏' users.author'在' where子句':

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

      ActiveRecord :: StatementInvalid:Mysql2 ::错误:未知列' users.author'在' where子句':SELECT users。* FROM users INNER JOIN book ON bookuser_id = usersid WHERE usersauthor =' Dan Brown'

      我的问题:是当我在where子句中传递一个字符串封装的字段和值时,它给了我结果但是当我在where子句中传递一个符号时,它给了我mysql未知列错误。那么ruby解释器如何知道从符号传递和字符串传递中获取数据的位置

2 个答案:

答案 0 :(得分:3)

当我们连接表格时,特别是在轨道中,轨道可以对连接的表格进行锯齿处理。

您的查询,      User.joins(:books).where(author: 'xxxx')用户表

中搜索作者字段

User.joins(:books).where(author: 'xxxx') 始终采用第一个表

的字段

User.joins(:books).where('author = ? ','xxxx') 在两个表格中进行搜索

例如,User.joins(:books).where('id = ? ','xxxx'),请尝试此查询。

在上面你会收到一个错误,因为两个表中都存在id字段并且它会混淆

但是,

User.joins(:books).where(id: 'xxxx') 有效,因为它仅在用户表中进行搜索。

所以,你可以使用通过书籍推荐作者 books: {author: 'xxxx'}

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

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

答案 1 :(得分:-1)

User.joins(:books).where('author = ? ','xxxx')没有sql注入,但User.joins(:books).where(author: 'xxxx')不是。

最好使用User.joins(:books).where('author = ? ','xxxx'),因为更容易编写更复杂的where子句。

当您撰写User.joins(:books).where(author: 'xxxx')时,rails译员会尝试解释为 users.author =' xxxx'

您可以查看link了解详情。