我不得不查询从excel文件中提取的一些奇怪的数据库,它的设计非常糟糕。这引起了我对ActiveRecord的一些奇怪需求,其中一个就是在急切加载关系时设置条件。
所以,这是我的问题和我的奇怪解决方案。
1.-我包括关系
ModelOne.includes(:relation)
2.-我尝试在所包含的表的列中设置条件
ModelOne.includes(:relation).where("relation.some_column = something")
我收到以下错误
Mysql2::Error: Unknown column some_column in where clause ...
当然,错误会显示不包含连接的查询或引用包含表的内容。
现在,另一方面,这有效:
ModelOne.includes(:relation).where(relation: { some_column: "something" })
这个带散列的sintax很酷但不支持LIKE查询,例如,所以......奇怪的是,在传递包含所包含表的哈希之后,每个对列的引用都是如此这个表有效。让我们说,对于我所发现的,这就是我如何做一个LIKE查询:
ModelOne.includes(:relation).where.not(relation: { id: nil }).where("some_column LIKE ?","")
注意奇怪的不是在哪里,它在调节查询方面没有任何作用,但我需要它,所以我可以在以下方法中使用eager加载表的列(LIKE' s,group等)
这样做的正确方法是什么?为什么Rails的行为如此?我究竟做错了什么? Rails什么时候实际包含急切加载的表?
注意:使用联接方法,在这种情况下,由于不同的原因,它不是一个选项
答案 0 :(得分:0)
http://guides.rubyonrails.org/active_record_querying.html
阅读13.2在预先加载的关联中指定条件
Using where like this will only work when you pass it a Hash. For
SQL-fragments you need use references to force joined tables:
Article.includes(:comments).where("comments.visible = true").references(:comments)