2016-06-28 117 views
0

如何获得所有没有子女或儿童情况的父母,如果其“状态”与“已批准”不同?基于子属性的关联查询

Parent.includes(:children).where.not(children: { status: 'approved' })

"SELECT \"parents\".* FROM \"parents\" INNER JOIN \"children\" ON  "children\".\"parent_id\" = \"parents\".\"id\" WHERE \"children\".\"state\" = 'approved'" 

它返回只有父母与status不同的孩子从approved但忽略父母有没有孩子

Parent.includes(:children).where(children: { id: nil })

"SELECT \"parents\".\"id\" AS t0_r0, \"parents\".\"date\" AS t0_r1, ........, \"parents\".\"slug\" AS t0_r33, \"children\".\"id\" AS t1_r0, \"children\".\"parent_id\" AS t1_r1, \"children\".\"request_state\" AS t1_r8 FROM \"parents\" LEFT OUTER JOIN \"children\" ON \"children\".\"edition_id\" = \"parents\".\"id\" WHERE \"children\".\"id\" IS NULL" 

它有没有孩子

只返回父母
+0

您正在使用哪个版本的Rails? –

+0

Rails 4.2.5,添加了一个标记,ty –

+0

您是否检查过有关'或'查询的问题,[像这样](http://stackoverflow.com/questions/7976358/activerecord-arel-or-condition)? –

回答

1

所以你需要一起加入这两个条件。

由于includes仅支持哈希像where子句的条件,所以我们需要使用references写的条件SQL source

使用,其中这样当你传递一个哈希只会工作。对于 SQL片段,你需要使用引用强制连接表

Parent.includes(:children).where("children.status <> 'approved' OR children.id IS NULL").references(:children) 

这给了一枪

+0

luskeskywalker,你已经这样做了,谢谢 –

+0

没问题,祝你好运 – lusketeer