0

私はそのようなコードを持っています

@pre_articles = Article.find(:all, :conditions => { :ART_ID => @linkla.map(&:LA_ART_ID)})
@articles = Kaminari.paginate_array(@pre_articles).page(params[:page]).per(15)

データの配列を選択していますが、それは巨大なので、ページ付けを追加することにしました。表示用に15のエントリを選択しますが、(ログ内の)すべてのページについても、SQLが最初の@pre_articlesのようにすべての配列を選択する方法を確認します。より高速にするために:たとえば0-15、15-30、30-45などのエントリをすべてのページで選択して表示するために送信する方法は?今ではすべてのデータを選択していますが、必要に応じて支払いを行っています

申し訳ありませんが、重要です!:

@linkla = LinkArt.where(:LA_ID => @la_typs.map(&:LAT_LA_ID), :LA_GA_ID => @genart.map(&:GA_ID)) 
@articles = Article.where(:ART_ID => @linkla.map(&:LA_ART_ID)).page(params[:page]).per(15)

だから私のクエリに見えます。ご覧のとおり、@ linklaの結果に応じて記事を選択し、linklaは以前と同じように多くの記事を選択しています...彼が私のページに対してのみ選択する方法

4

2 に答える 2

0

条件付き検索の代わりにwhere句を使用するのはどうですか?

@articles = Article.where(:ART_ID: @linkla.map(&:LA_ART_ID)).page(params[:page]).per(15)

生成されるSQLクエリには、不要なデータのロードを回避するためのLIMIT句が含まれます。

于 2012-06-22T13:26:19.773 に答える
0

述べられた問題の解決策:

LinkType
  has_many :links
  # let us assume there is a column called name 

# I wasn't sure about this model from your description
GenArt
  has_many :links
  # let us assume there is a column called name 

Link
  belongs_to :article
  belongs_to :link_type  
  belongs_to :gen_art
  # columns: id, article_id, link_type_id, gen_art_id

Article
  has_many :links

paramsハッシュにlink_type_namesとが含まれていると仮定しますgen_art_names

Article.joins(:links => [:link_type, :gen_art]).where(
  :links => {
    :link_type => {:name => params[:link_type_names]},
    :link_type => {:name => params[:gen_art_names]}
  }
).page(7).per(50)  
于 2012-06-22T19:09:26.187 に答える