Railsがbelongs_toアソシエーションに不要な(私が思う)句を追加しているという問題があります-アソシエーションが外部キーを使用している場合でも、タイプを制限します。
STIの設定は次のようになります。
class Foo < ActiveRecord::Base
belongs_to :apple
end
class Apple < Fruit
has_many :foos
end
したがって、の主キー列IDにリンクする列がありFoo
、はSTIの下にあります。私はこれらすべてに満足しています。apple_id
fruits
Apple
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_tofruits
であるため、タイプ部分は冗長に見えます。レールがその部分をルックアップに追加するのを止めて、これを取得できますか?
SELECT "foos".* FROM "foos" INNER JOIN "fruits" ON "fruits"."id" =
"foos"."apple_id"
Fooでできることはわかっていbelongs_to :apple, :class_name => "Fruit"
ますが、オブジェクトが返されたときにオブジェクトが自動的にApple
sになるようにします。
誰かが私の動機に疑問を投げかけた場合...type句が他のテーブルにクエリを実行するときにpostgresが選択するクエリプランを台無しにしているので、これを実行したいと思いますfruits
(はい、私はインデックスを持っていてtype
、マルチを試しました-列1 [type,id]
)。ここで完全に説明するのは少し複雑/無関係です。