ruby-on-rails 对嵌套查询求反将返回空结果集

j8ag8udp  于 2023-05-02  发布在  Ruby
关注(0)|答案(1)|浏览(108)

我有一个关于Rails中否定嵌套查询的问题 www.example.com
我有两个模型:ProfileTask,通过外键Task#profile_id连接。我的目标是根据配置文件是否包含特定state中的任务来选择配置文件。为此,我使用了一个嵌套查询,它返回配置文件id,并将它们提供给主查询,如下所示:

# Profiles containing any stopped task
Profile.where(
  id: Task.where(state: "stopped").select(:profile_id)
)

...效果很好然而,当我尝试用not否定嵌套查询时:

# Profiles containing no started task
Profile.where.not(
  id: Task.where(state: "started").select(:profile_id)
)

...它不起作用-我总是得到一个空的结果集。(当然,数据库包含否定和非否定情况的条目!)
任何帮助赞赏:)
(P.S.我知道嵌套查询在性能方面很糟糕,但是对于给定的数据模型,我无法提出更好的方法:-/也很高兴听到关于这方面的建议!)

cuxqih21

cuxqih211#

只需设置一个关联并加入它即可。
至少有一个已停止任务的配置文件

Profile.joins(:tasks)
       .where(tasks: { state: 'stopped' })

没有停止任务的配置文件:

Profile.left_joins(:tasks)
       .where(tasks: { state: 'stopped', id: nil })

x停止任务数的配置文件:

Profile.joins(:tasks)
       .group(:id)
       .where(tasks: { state: 'stopped'})
       .having(Task.arel_table[:id].count.eq(x))

相关问题