2017-09-19 10 views
0

すべてのカテゴリを表示するインデックスページを作成しようとしています。アルファベット順にです。ただし、そのカテゴリに記事がタグ付けされている。記事には多くのカテゴリがあります。Ruby on Rails:記事が含まれている場合、インデックスページのカテゴリのみを表示します

インデックスページを最初に読み込むと、2つのカテゴリのみが表示されます。次の2つのカテゴリを読み込むために、インデックスページの下部に「もっと多くのロード」ボタンがあります。

カテゴリ変数をどのように割り当てているかには誤差があると思います。 AJAXボタンの動作が、同じ2カテゴリ名(例えば、 "A" 示され、 "B"、代わりに次の2(例えば "C" & "D")の中である。

カテゴリコントローラ

def index 
    if params[:name] 
     @categories = Category.with_articles.order('name ASC').where('name> ?', params[:name]).limit(2) 
    else 
     @categories = Category.with_articles.order('name ASC').limit(2) 
    end 
    respond_to do |format| 
     format.html 
     format.js 
    end 
    end 

カテゴリ/ index.html.erb

<%= render @categories %> 

schema.rb

create_table "categories", force: :cascade do |t| 
    t.string "name" 
    end 

    create_table "article_categories", force: :cascade do |t| 
    t.integer "article_id" 
    t.integer "category_id" 
    end 

モデル/ category.rb

class Category < ApplicationRecord 
    has_many :article_categories 
    has_many :articles, through: :article_categories 

    def self.with_articles 
    includes(:articles).where.not(articles: { id: nil }) 
    end 

end 

EDIT: モデル/ article_category.rb

class ArticleCategory < ActiveRecord::Base 

belongs_to :article 
belongs_to :category 

end 

モデル/ article.rb

class Article < ApplicationRecord 
    has_many :article_categories 
    has_many :categories, through: :article_categories 
end** 

enter image description here

答えて

1

これを試してみてください:

def index 
    @categories = Category.articles.order('name ASC').limit(2) 
    respond_to do |format| 
    format.html 
    format.js 
    end 
end 

私はこれが解決されると、モデルcategoryから機能with_articlesを削除することができると思います。

+0

記事をカテゴリに関連付けることができません: "Category.articles"、これはカテゴリモデルにhas-many through associationを使用しているためです。 "Category.includes(:articles)を使用しますが、同じ問題が発生します。 – doyz

+0

try:' Category.joins(:articles) ' –

+0

表示される問題を投稿できますか? –

1

あなたはoffsetが欠けています。 paramと言うと、offsetとする必要があります。すべてのajaxリクエストを送信します。 オフセットは、n - the number of recordsをスキップした後limit機能で渡されるようにします。レコードの数はpassed inです。

ので、理想的にはデータベースからの最初の二つのレコードを取得した後、あなたがoffset

あなたのparamsで2として
def index 
    if params[:name] 
    @categories = Category.with_articles.order(:name).where('name> ?', params[:name]).limit(2).offset(params[:offset].to_i) 
    else 
    @categories = Category.with_articles.order(:name).limit(2).offset(params[:offset].to_i) 
    end 
    respond_to do |format| 
    format.html 
    format.js 
    end 
end 

を渡す必要があるので、最初の二つのレコードをスキップし、他の二つのレコードを取得する必要がありますが、これは

+0

これは私にとってはうまくいきません。同じ2つのカテゴリ名がレンダリングを続けて、追加のボタンをクリックするたびに既存のカテゴリの下に追加されます。 – doyz

+0

あなたは 'offset'を使って、それをparamとして送りましたか? –

+0

上記のコードをコピーしてコントローラに貼り付けました – doyz

0
を役に立てば幸い

あなたのコードはうまく見えますが、もっと複雑になっているようです。

def index 
    @categories = Category.articles.where('articles.id > ?',params[:id]).order('name ASC').limit(2) 
    respond_to do |format| 
    format.html 
    format.js 
    end 
end 

最後の記事のidを送信することができます。それが動作することを願って!

関連する問題