我有一个问题,rails 向我的 belongs_to 关联添加了不必要的(我认为)子句 - 即使我的关联使用外键,也会限制类型。
STI 设置如下所示:
class Foo < ActiveRecord::Base
belongs_to :apple
end
class Apple < Fruit
has_many :foos
end
所以Foo
有一apple_id
列链接到 中的主键列 ID fruits
,并且Apple
是 STI 下Fruit
。我对这一切感到满意。
现在:
> Foo.joins(:apple).to_sql
SELECT "foos".* FROM "foos" INNER JOIN "fruits" ON "fruits"."id" =
"foos"."apple_id" AND "fruits"."type" IN ('Apple')
为什么要添加 rails AND "fruits"."type" IN ('Apple')
?它是使用表的主键的 belongs_to fruits
,因此类型部分似乎是多余的。我可以阻止rails将该部分添加到查找中并得到这个:
SELECT "foos".* FROM "foos" INNER JOIN "fruits" ON "fruits"."id" =
"foos"."apple_id"
我知道我可以belongs_to :apple, :class_name => "Fruit"
在 Foo 中做,但我希望对象在返回时自动变为Apple
s。
万一有人质疑我的动机......我想这样做是因为 type 子句弄乱了 postgres 在我fruits
对其他表进行查询时选择的查询计划(是的,我有一个索引type
,甚至尝试了一个 multi -第一栏[type,id]
)。在这里完全描述有点复杂/无关紧要。