Join关联查询时无关联RecordLabel的Record记录如何正确返回?
问题原因
原有查询用的joins本质是内连接(INNER JOIN),只会保留存在至少一条关联RecordLabel的Record记录,没有任何关联的Record会直接被过滤。另外直接在where里写record_labels.user_id != ?会把无关联时user_id为NULL的记录也一起过滤,所以无法命中无关联的记录。
修改方案
Record.for_company(company_id) .left_outer_joins(:record_labels) .group('records.id') .having('COUNT(record_labels.id) < ?', required_label_count) .where.not( id: RecordLabel.select(:record_id).where(user_id: user_id) )
修改点说明
- 把
joins替换为left_outer_joins:左连接会保留所有符合基础条件的Record记录,哪怕没有关联的RecordLabel,无关联时对应record_labels的字段值为NULL,不会被提前过滤。如果你用的是Rails 5以下的版本,可以把这行替换为.joins("LEFT OUTER JOIN record_labels ON record_labels.record_id = records.id") - 用子查询过滤指定用户创建的标签:替换原有
where条件为where.not(id: RecordLabel.select(:record_id).where(user_id: user_id)),可以直接排除所有「存在该用户创建的关联标签」的Record,不会误伤到没有任何关联标签的记录,逻辑更符合需求 COUNT(record_labels.id)本身就会把无关联的记录统计为0,只要0小于你设置的required_label_count,这些无关联的记录就会被正常命中
如果你的需求是总关联数小于等于required_label_count,把having里的<改回<=即可。
内容的提问来源于stack exchange,提问作者Martynas Jurkus
相关产品推荐
相关产品推荐

