1

私のコードはまだ開発中であり、生産ではありません。私は、いくつかのビューに対して必要なデータを生成する壁を打っています。多型関連を削除する必要がありますか?

皆さんを詳細に埋め込むことなく、基本的に複数のモデルの関連付けをナビゲートして、各レベルで情報を取得したいと考えています。私に問題を与えている1つの関連は、多態性のbelongs_toです。ここには最も関連性の高い関連団体があります

Model Post 
    belongs_to :subtopic 
    has_many :flags, :as => :flaggable 

Model Subtopic 
    has_many :flags, :as => :flaggable 

Model Flag 
    belongs_to :flaggable, :polymorphic => true 

私は、フラグ#インデックスビューに複数のフラグを表示したいと思います。私が表示したい他のモデルからの情報もありますが、これをもっと簡単にするためにここでは詳細を省いています。

私のFlags_controller#indexアクションで、私は現在、データベースから必要なものすべてをプルするのに@flags = paginate_by_sqlを使用しています。私は正常にデータを取得することができますが、関連するモデルオブジェクトをeager-loadedにすることはできません(ただし、必要なデータはすべてメモリ内にあります)。私は今いくつかのオプションを見ています:

  • @flagsオブジェクトのSQLデータを処理するために私のビューを書き直してください。これはうまくいくはずで、インデックスページの行ごとに5-6アソシエーションモデルのSQLクエリーが行われなくなりますが、非常に面白く見えます。多型から離れて一人の個人のフラグ

  • 変更モデル階層/定義を見たとき、私は、唯一のロードするために私の見解を簡素化し、より詳細な情報については、追加のページを作成

  • 可能であればこれを避けるしたいのですが継承への関連。効果的にSubtopicPostの親となるモジュールまたはクラスFlaggableObjectを作成します。

私は第三の選択肢に傾いていますが、私はきれいに私はRailsのActiveRecordのヘルパーを使用するすべての情報を引き出すことができるでしょうことは確かではありませんよ。

私はあなたがよりよい解決策

EDITしている場合、これは、より重要なのは、仕事とするかどうかの洞察たい:私は

@flags = Flag.find(:all,:conditions=> "flaggable_type = 'Post'", :include => [{:flaggable=>[:user,{:subtopic=>:category}]},:user]).paginate(:page => 1) 

=> (valid response) 


@flags = Flag.find(:all,:conditions=> ["flaggable_type = 'Post' AND 
    post.subtopic.category_id IN ?", [2,3,4,5]], :include => [{:flaggable=> 
    [:user, {:subtopic=>:category}]},:user]).paginate(:page => 1) 

=> ActiveRecord::EagerLoadPolymorphicError: Can not eagerly load the polymorphic association :flaggable 

答えて

1

ドン」に遭遇したいくつかのNIT-うるさいinclude行動を多型関連を削除します。関連付けられたオブジェクトを熱心に読み込むには、includes(:association_name)を使用します。 paginate_by_sqlは動作しませんが、paginateとなります。

@flags = Flag.includes(:flaggable).paginate(:page => 1) 

これは、各テーブルから1つのクエリを使用して、正確に何をしたい行います。

A Guide to Active Record Associationsを参照してください。 :includeオプションを使用する古い例が表示されることがありますが、includesメソッドは、Rails 3.0および3.1のnew interfaceです。オリジナルポスターから

更新:

あなたはこのエラーを取得している場合:Can not eagerly load the polymorphic association :flaggableは、以下のような何かをしようとは:

Flag.where("flaggable_type = 'Post'").includes([{:flaggable=>[:user, {:subtopic=>:category}]}, :user]).paginate(:page => 1) 

詳細はコメントを参照してください。

+0

熱心なロードはポリモーフィック団体では動作しませんので、私はpaginate_by_sqlを使用している理由です。私は確かに二重にチェックして、このエラーが発生しました。 '多態的な関連付けを熱心に読み込むことはできません:flaggable' –

+0

どのバージョンのrails/will_paginateを使用していますか?この回答を投稿する前に、Rails 3.0.7でこれをテストし、will_paginate 2.3.15。 will_paginateは欠けている 'add_limit!'メソッドを探しますが、それをハッキングした後にうまくいきました。 –

+0

私はレール3.0.7であり、予定は3.0です.pre2。私はwill_paginate、 'g = Flag.includes(:flaggable).all'なしで試してみましたが、うまくいきました。 will_paginate呼び出しで追加するとエラーが発生しました。あなたは 'add_limit! 'で何をしましたか? –

1

問題:多型関連を数えます。

@flags = Flag.find(:all,:conditions => ["flaggable_type = 'Post' AND post.subtopic.category_id IN ?", 
[2,3,4,5]], :include => [{:flaggable => [:user, {:subtopic=>:category}]},:user]) 
.paginate(:page => 1) 

次のように試してみてください。

@flags = Flag.find(:all,:conditions => ["flaggable_type = 'Post' AND post.subtopic.category_id IN ?", 
[2,3,4,5]], :include => [{:flaggable => [:user, {:subtopic=>:category}]},:user]) 
.paginate(:page => 1, :total_entries => Flag.count(:conditions => 
["flaggable_type = 'Post' AND post.subtopic.category_id IN ?", [2,3,4,5]])) 
関連する問題