在Rails中包含条件的奇怪行为

时间:2015-06-25 03:45:15

标签: mysql ruby-on-rails ruby

我不得不查询从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什么时候实际包含急切加载的表?

注意:使用联接方法,在这种情况下,由于不同的原因,它不是一个选项

1 个答案:

答案 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)