1

これが簡単なものになることを願っています:)これをエミュレートしようとして、has_manyオプションをいじって何時間も詰め込んでいます:

has_many :pages, :finder_sql => %q(SELECT * FROM `pages` LEFT OUTER JOIN `component_instances` ON `component_instances`.instance_id = `pages`.id AND `component_instances`.instance_type = 'Page' WHERE `component_instances`.parent_id = #{id})

これは基本的にポリモーフィック結合であるため、中心的な構造として機能し、さまざまなタイプのものをぶら下げている component_instances テーブルがあります。これはネストされたセットです (この場合は問題ではありません)。

問題は、has_many では結合条件を操作できないことのようです。また、自動生成される外部キー結合条件を無効にすることはできません。

上記のコードは機能しますが、結果にスコープを使用したいのですが、カスタム クエリではそれができません。

どんな助けでも大歓迎です:)

乾杯、

ブレンドン

4

3 に答える 3

0

笑、その上で寝ると答えがわかりました:

class PageSet < ActiveRecord::Base

  unloadable

  set_table_name "component_instances"

  has_many :children, :foreign_key => :parent_id, :class_name => 'PageSet'
  belongs_to :instance, :polymorphic => true, :dependent => :destroy
  has_many :pages, :through => :children, :source => :instance, :source_type => 'Page'

end

parent_id を介したリンクを持つエンティティは当然のことながら子です。間違った方法でそれらを参照していましたが、AR はエラーを発生させませんでした :)

于 2009-07-04T21:14:00.847 に答える
0

マイケルのリードに感謝します。最終的にこれはうまくいきました:

  has_one :page_set, :foreign_key => :parent_id
  belongs_to :instance, :polymorphic => true, :dependent => :destroy
  has_many :pages, :through => :page_set, :source => :instance, :source_type => 'Page', :extend => LearningCaveFilterExtension

しかし、:page_set メソッドは実際には完全に間違ったものを返すため、少し大ざっぱです。理想的には自分自身を返す必要がありますが、:parent_id を外部キーとして配置して、has_many ページ宣言から生成された SQL が正しくなるようにする必要がありました (:id を使用するのが正しい方法ですが、:pages メソッドが台無しになります。:)心はここで何が起こっているのかを完全には把握していませんが、少なくとも機能し、スコープも機能します:)

助けてくれてありがとう。それが機能する理由について何か説明があれば、私に知らせてください:)

于 2009-07-04T10:48:03.520 に答える