Ruby on Rails:如果它包含任何文章,则仅在索引页面上显示类别

时间:2017-09-19 16:18:11

标签: ruby-on-rails ruby

我正在尝试创建一个索引页面,按字母顺序显示所有类别 ,但前提是该文章已被标记为该类别。一篇文章可以有很多类别。

首次加载索引页面时,它只显示2个类别。索引页面底部有一个“加载更多”的ajax按钮来加载接下来的两个类别。

我认为我如何分配categories变量有一个错误。 ajax按钮有效,但显示相同的2个类别名称(例如“A”和“B”,而不是下一个2(例如“C”和“D”)。

类别控制器

public void OnPressStarted()
     {
         if (PressStarted != null)
         {
             PressStarted(this, EventArgs.Empty);
         }
     }

     public void OnPressEnded()
     {
         if (PressEnded != null)
         {
             PressEnded(this, EventArgs.Empty);
         }
     }

类别/ index.html.erb

  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

schema.rb

<%= render @categories %>

模型/ category.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

修改模型/ article_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

模型/ article.rb

class ArticleCategory < ActiveRecord::Base

belongs_to :article
belongs_to :category

end

enter image description here

3 个答案:

答案 0 :(得分:1)

试试这个:

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

我认为这会解决,您可以从模型category中删除函数with_articles

答案 1 :(得分:1)

你错过了offset的事情。您需要维护paramoffset并将其发送给每个ajax请求 Offset允许您在跳过后获取限制函数中传递的n - the number of records - 记录数passed in offset`函数。

所以,理想情况下从数据库中获取前两个记录后,您需要通过跳过前两个记录来获取其他两个记录,因此您需要将offset作为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

希望这有帮助

答案 2 :(得分: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

在Ajax调用中,您可以发送上一篇文章的id。希望它有效!