Rails / SQL:查找没有孩子或有所有孩子的父母

时间:2019-03-04 20:48:50

标签: sql ruby-on-rails ruby postgresql activerecord

我需要找到没有孩子或只有所有孩子的父母(状况= 1)。

class Parent
  has_many :children
end

class Child
  enum status: [ :confirmed, :not_confirmed ]
  belongs_to :parent
end

我知道第一部分是找到没有孩子的父母。

Parent.joins(:children).where('count(children) = 0')

确定答案。

2 个答案:

答案 0 :(得分:1)

由于您使用的是Postgres,因此可以使用NOT EXISTS查询:

# Parents with no children
Parent.where.not('exists (?)', Child.where('children.parent_id = parents.id').select(1))

此查询的性能比任何需要连接的查询都要好,因为EXPLAIN将向您显示Postgres将通过Nested Loop Anti Join操作来完成此操作。

答案 1 :(得分:0)

这是Rails中的解决方案:

<select id="drpQuantity" onchange="setUrl(this)">...</select>

<script>
function setUrl(element) {
    var value = element.value;

    document.getElementById('link').href = '@Url.Action("AddNewItems", "Home", new { ItemId = QitemId })' + '&Quantity=' + selected;
}
</script>

基本上,您需要使用<a id="link" href="/Home/AddNewItems?ItemId=1&Quantity=1">Add New</a> (请参阅Rails5 Reference中的grp = Parent.left_outer_joins(:children).distinct models = grp.where('children.id IS NULL').or(grp.where('children.status = 1')) )。

我认为您的第一部分示例无效。它将返回错误消息,例如

LEFT OUTER JOIN

Rails left_outer_joins也是# ActiveRecord::StatementInvalid (PG::GroupingError: ERROR: # aggregate functions are not allowed in WHERE