活动记录 - 获取关联不存在的记录

时间:2017-08-08 16:52:29

标签: ruby-on-rails activerecord

我有一个模型A,其中包含B模型(因此B模型使用foreign_key a_id引用A)。 我想获得所有未被任何B记录引用的A记录。使用活动记录更有效的方法是什么? 谢谢!

3 个答案:

答案 0 :(得分:3)

从Rails 5开始:

A.left_outer_joins(:bs).where(bs: { a_id: nil })

SQL的输出是:

SELECT "as".* FROM "as"
LEFT OUTER JOIN "bs" ON "bs"."a_id" = "a"."id"
WHERE "bs.a_id" IS NULL

答案 1 :(得分:1)

详细信息可能取决于您的数据库,您创建的索引以及您存储的数据,但我建议您尝试使用子查询:

A.where.not(id: B.select(:a_id))

在PostgreSQL上,这将导致单个查询,如:

SELECT * FROM as WHERE id NOT IN (SELECT a_id FROM bs)

答案 2 :(得分:0)

我在想你的模特看起来像

class A < ApplicationRecord
  has_may :bs
end

class B < ApplicationRecord
  belongs_to :a
end

我认为你的schema.rb看起来像

  create_table "as", force: :cascade do |t|
    t.integer  "id"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
  end

  create_table "bs", force: :cascade do |t|
    t.integer  "id"
    t.integer  "a_id"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
  end

如果我有这个权利那么你应该能够做到

A.where.not(id: B.select(:a_id))