我有两个型号User和Book。用户有用户名和电子邮件字段,Book有作者和标题字段。当我使用联接来获取基于相关数据的用户以及where子句中传递的条件时,我得到的结果不同
当我运行时
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')
生成的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 book
。user_id
= users
。id
WHERE users
。author
=' Dan Brown'
我的问题:是当我在where子句中传递一个字符串封装的字段和值时,它给了我结果但是当我在where子句中传递一个符号时,它给了我mysql未知列错误。那么ruby解释器如何知道从符号传递和字符串传递中获取数据的位置
答案 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了解详情。