Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在where子句中通过连接传递符号和字符串有什么区别_Ruby On Rails_Ruby_Ruby On Rails 3_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 在where子句中通过连接传递符号和字符串有什么区别

Ruby on rails 在where子句中通过连接传递符号和字符串有什么区别,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,我有两个模型用户和书。用户有用户名和电子邮件字段,书籍有作者和标题字段。当我使用连接根据where子句中传递的条件的关联数据获取用户时,我会得到不同的结果 当我运行这个 User.joins(:books).where('author = ? ','xxxx') User.joins(:books).where(author: 'xxxx') 生成的Mysql查询为: "SELECT `users`.* FROM `users` INNER JOIN `books` ON `books

我有两个模型用户和书。用户有用户名和电子邮件字段,书籍有作者和标题字段。当我使用连接根据where子句中传递的条件的关联数据获取用户时,我会得到不同的结果

当我运行这个

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

 "SELECT `users`.* FROM `users` INNER JOIN `books` ON `books`.`user_id` = `users`.`id` WHERE (author = 'xxxxx' )"
给我一个用户,他的书包括xxxx作者

当我运行这个

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

"SELECT `users`.* FROM `users` INNER JOIN `books` ON `books`.`user_id` = `users`.`id` WHERE `users`.`author` = 'xxxx'"> 
给出Mysql2::错误:“where子句”中的未知列“users.author”:

 SELECT `users`.* FROM `users` INNER JOIN `books` ON `books`.`user_id` = `users`.`id` WHERE `users`.`author` = 'xxxx' 
ActiveRecord::StatementInvalid:Mysql2::错误:“where子句”中的未知列“users.author”:从book.user\u id=users.id where users.author='Dan Brown'

我的问题是:当我在where子句中传递字符串封装的字段和值时,它会给我结果,但当我在where子句中传递符号时,它会给我mysql未知列错误。那么ruby解释器如何知道在符号传递和字符串传递中从何处获取数据呢xxxx'不受sql注入的影响,但User.joins:books.whereauthor:'xxxx'不是

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

当您编写User.joins:books.where时,作者:“xxxx”rails解释器将尝试解释为用户。作者=“xxxx”


您可以查看以了解更多信息

当我们连接表时,尤其是在rails中,rails有能力处理连接表的别名

你的问题,, User.joins:books.where作者:“xxxx”在用户表中搜索“作者”字段

User.joins:books.whereauthor:'xxxx'始终获取第一个表的字段,并且

User.joins:books.where'author=?','xxxx'在两个表中搜索

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

在上面的示例中,您将得到一个错误,因为id字段在两个表中都存在,并且会混淆

但是,

User.joins:books.whereid:'xxxx'有效,因为它只在用户表中搜索

所以,您可以使用,通过书籍引用作者:{author:'xxxx'}


谢谢你的回答@Sabyasachi。但我的问题是,rails在传递字符串以在books表中搜索作者,而在传递符号时决定在users表中搜索作者,那么rails是如何决定的呢?您能否详细说明具体情况。whereauthor:'xxx'易受sql注入攻击?它如何不受sql注入用户的影响。joins:books.whereauthor:'xxxx'?谢谢您的回答@斯拉文。但我的问题是,rails在传递字符串以在books表中搜索author时如何决定,而在传递符号时如何决定在users表中搜索