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