4

私はこのようなポリモーフィックな関連性を持っています-

class Image < ActiveRecord::Base
  has_one :approval, :as => :approvable
end

class Page < ActiveRecord::Base
  has_one :approval, :as => :approvable
end

class Site < ActiveRecord::Base
  has_one :approval, :as => :approvable
end

class Approval < ActiveRecord::Base
  belongs_to :approvable, :polymorphic => true
end

どこで承認を見つける必要がありますapproval.apporvable.deleted = false

私はこのようなことを試みました-

@approvals = Approval.find(:all, 
   :include => [:approvable], 
   :conditions => [":approvable.deleted = ?", false ])

これにより、「ポリモーフィックな関連付けを熱心にロードできません:approvable」エラーが発生します

承認可能なアイテムが削除されない承認付きの結果セットを取得するために、条件を正しく指定するにはどうすればよいですか?

事前に助けてくれてありがとう

4

4 に答える 4

3

すべての「承認可能」が異なるテーブルに存在するため、これは不可能です。代わりに、すべての承認を取得してから、通常の配列メソッドを使用する必要があります。

@approvals = Approval.all.select { |approval| !approval.approvable.deleted? }
于 2010-07-23T15:13:37.717 に答える
3

あなたが求めているのは、SQL に関して、結果セット内のさまざまな行に対してさまざまなテーブルからデータを投影することです。私の知る限り、それは不可能です。

したがって、次のことに満足する必要があります。

@approvals = Approval.all.reject{|a| a.approvable.deleted? }
# I assume you have a deleted? method in all the approvables
于 2010-07-23T15:14:14.087 に答える
1

ここで既に提示されている回答のいずれかをお勧めします (それらは同じものです) が、単一のクエリですべてを実行したい場合は、削除されたフラグを承認モデルに入れることもお勧めします。

ポリモーフィックなリレーションシップを使用すると、レールはポリゴンで熱心なフェッチを使用できますが、リレーションシップが不明であるため、クエリが実際には複数のクエリが交差するため、それらに参加することはできません。

最後に、本当に必要な場合は、SQL にドロップして、単一のクエリですべてのタイプの承認可能なものに対して実行できるすべての可能な結合を交差させますが、手動で多くの結合を行う必要があります。(手動でレールの組み込みメカニズムを使用しないことを意味します...)

于 2010-07-23T18:01:05.790 に答える
0

あなたの答えをありがとう、私はこれができないと確信していました。後でパフォーマンス関連の問題を回避するために、結果セットをループする以外の解決策を期待していたことに加えて、さらに確認が必要でした。当分の間、拒否/選択の両方は問題ありませんが、長期的には、これらのSQL結合を実行する必要があります手動で。またよろしくお願いします!!

M

于 2010-07-23T19:48:53.263 に答える