我尝试使用以下语法动态创建SQL查询:
Company.joins(:founder_persons)
.where("people.first_name like people[:first_name]", {people: {first_name: 'm%'}})
但是在rails控制台上运行它会给我TypeError: can't quote Array
。我猜这不是我们如何使用where字符串?修复此错误的正确方法是什么?感谢。
答案 0 :(得分:3)
你可以绑定任何值,然后分配它,这样它们应该在数字上重合,如:
Model.joins(:join_table)
.where('models.first_attribute LIKE ? AND models.second_attribute LIKE ?', value_for_first_attr, value_for_second_attr)
如果使用数组,则应访问要比较的每个索引,或者可以在splat *
之前,并指定一个值,如:
Model.joins(:join_table)
.where('models.first_attribute LIKE ? AND models.second_attribute LIKE ?', *array_of_values)
请注意,虽然这样你传递的是“整个”数组,但它的大小或数字也应该重合,否则会引发ActiveRecord::PreparedStatementInvalid
错误,具体取决于是否有更多或更少的元素。
答案 1 :(得分:2)
发生此错误的一个原因是使用嵌套数组作为SQL值。
示例:
Article.where(author: ['Jane', 'Bob'])
有效,但是:
Article.where(author: ['Jane', ['Bob']])
会给出错误。快速解决方法是在阵列上运行flatten
。
(提及此问题,因为在搜索令人困惑的错误“无法引用数组”时出现此页面。)