【问题标题】:ActiveRecord - Avoiding record instantitation while looking up many to many relationActiveRecord - 在查找多对多关系时避免记录实例化
【发布时间】:2019-09-05 09:44:01
【问题描述】:

我的 Rails 6 / PostgreSQL 应用程序中有两个模型,它们具有多对多关系; CarDriver。目标是获取完全没有关联的所有记录(汽车)(驾驶员)。目前这是使用 Ruby (2.6.3) 完成的,如下所示:

result = []
Car.all.each do |car|
  result << car.id if car.drivers.empty?
end

是否有避免实例化每条记录的 ActiveRecord 表达式?

【问题讨论】:

    标签: ruby-on-rails ruby postgresql activerecord


    【解决方案1】:

    试试:

    Car.left_joins(:drivers).where(drivers: { id: nil }).pluck(:id)
    

    你首先left join有司机的汽车拥有所有与之关联的汽车和驱动器,然后你在where中过滤没有司机的汽车,最后用pluck只选择一列(id)。

    【讨论】:

    • 对,在这种情况下left joinincludes 好。 `drivers: { id: nil }` 看起来更好。 :)
    • 为什么是.pluck('cars.id')?问题中没有任何理由。
    • @max 有问题的代码表明 OP 希望将 car_ids 数组作为此操作的结果。顺便说一句.pluck(:id) 会更好,我让自己为你解决这个问题。 :)
    • 在这种情况下,您可以只使用.ids 而不是.pluck(:id)。但通常这并不是一个好主意。只需按原样使用范围 - 这样 ActiveRecord 可以将其用作子查询,如果您在 where 子句中使用它而不是强制两个查询。
    猜你喜欢
    • 2011-04-27
    • 2018-07-05
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多