3

私はRubyonRails 3.2.2を使用していますが、has_many :through「カテゴリ内の記事を並べ替える」ために次の関連付けがあります。

class Article < ActiveRecord::Base
  has_many :category_associations                                     # Association objects
  has_many :associated_categories, :through => :category_associations # Associated objects
end

class CategoryAssociation < ActiveRecord::Base
  acts_as_list :scope => 'category_id = #{category_id} AND creator_user_id = #{creator_user_id}'

  belongs_to :associated_article
  belongs_to :creator_user, :foreign_key => 'creator_user_id'
end

取得時に、値を表示する必要があるため、ユーザーによって作成されたオブジェクトassociated_categoriesをロードしたいと思います(:作成者のユーザーはデータベーステーブルに存在する列によって識別されます)(:属性、 aはgemとitに必要です)データベーステーブルに存在する列です)各記事のタイトルの「近く」。category_associationscreator_user_idcategory_associationspositionpositionIntegeract_as_listcategory_associations

実際には、私の見解では、適切かつパフォーマンスの高い方法で次のようなものを作成したいと思います(:の各記事は@articles、ユーザーによって「カテゴリに関連付けられている」と想定されています-ユーザーは、category_associations):

<% @articles.each do |article| %>
  <%= link_to(article.title, article_path(article)) %> (<%= # Display the article position in the given category %>)
<% end %>

おそらく、カスタムデータ構造を「作成」して「処理」する必要があります(または、他の構造を作成する必要があります...)が、探していることを達成する方法はありません。


現時点では、次のことを行うために関連付けオブジェクトにさらに条件を指定する必要があるため、 N + 1クエリの問題を回避できるため、積極的な読み込みが私の場合に適したアプローチであると考えています。

  • 特定のユーザーによって作成された関連付けオブジェクトの特定の属性値(私の場合はposition値を参照)を取得します。
  • これらの特定の属性値のそれぞれを、対応する関連オブジェクトに「関連付け」ます(何らかの方法で、position値が表示に適しているようにします) 。
4

1 に答える 1

0

私は、あなたはこれを探していると思います

@articles = Article.includes(:associated_categories)

これにより、両方の関連付け (associated_categories、associated_categories) を含むすべての記事が熱心に読み込まれます。したがって、ビューで @articles とその関連付けを反復処理するときに N+1 問題を回避し、クエリを起動しません。

于 2012-09-30T19:36:47.273 に答える