0

Railsがbelongs_toアソシエーションに不要な(私が思う)句を追加しているという問題があります-アソシエーションが外部キーを使用している場合でも、タイプを制限します。

STIの設定は次のようになります。

class Foo < ActiveRecord::Base
  belongs_to :apple
end

class Apple < Fruit
  has_many :foos
end

したがって、の主キー列IDにリンクする列がありFoo、はSTIの下にあります。私はこれらすべてに満足しています。apple_idfruitsAppleFruit

今:

> 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"ますが、オブジェクトが返されたときにオブジェクトが自動的にApplesになるようにします。

誰かが私の動機に疑問を投げかけた場合...type句が他のテーブルにクエリを実行するときにpostgresが選択するクエリプランを台無しにしているので、これを実行したいと思いますfruits(はい、私はインデックスを持っていてtype、マルチを試しました-列1 [type,id])。ここで完全に説明するのは少し複雑/無関係です。

4

1 に答える 1

1

基本的にAMは、継承チェーンを尊重するために('Apple')部分を追加しています。

たとえば、

class GreenApple < Apple
end

あなたが得るでしょう。

Foo.joins(:apple).to_sqlSELECT"foos"。*FROM"foos" INNER JOIN "fruits"ON"fruits"。"id"="foos"。"apple_id"AND"fruits"。"type"IN( 'Apple'、'GreenApple')

何らかの理由で、参照されたpkを使用してフルーツをテーブルに表示することになったが、タイプが異なる場合は、知らないうちに別の種類のオブジェクトをインスタンス化することになり、その後、例外が発生することなく問題が発生する可能性があります。

于 2012-07-13T01:20:25.073 に答える