0

我有一个问题,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 中做,但我希望对象在返回时自动变为Apples。

万一有人质疑我的动机......我想这样做是因为 type 子句弄乱了 postgres 在我fruits对其他表进行查询时选择的查询计划(是的,我有一个索引type,甚至尝试了一个 multi -第一栏[type,id])。在这里完全描述有点复杂/无关紧要。

4

1 回答 1

1

基本上 AM 正在添加 ('Apple') 部分,因为为了尊重继承链。

例如,如果你有

class GreenApple < Apple
end

你会得到。

Foo.joins(:apple).to_sql SELECT "foos".* FROM "foos" INNER JOIN "fruits" ON "fruits"."id" = "foos"."apple_id" AND "fruits"."type" IN ( “苹果”、“青苹果”)

如果出于某种原因,您最终在水果表上有一个带有引用 pk 但类型不同的水果,您最终可能会在不知道它的情况下实例化不同类型的对象,然后事情可能会出错而不会出现异常。

于 2012-07-13T01:20:25.073 回答