Ruby on rails:过滤后计算每个类别的记录数

时间:2017-10-11 17:15:27

标签: ruby-on-rails ruby ruby-on-rails-5

我在browse.html.erb上有一个Ransack搜索表单,按标题和类别过滤文章。当我第一次进入浏览页面而不进行任何搜索时,我想要一个所有类别的列表,其中包含属于要在侧栏上呈现的类别的文章计数。提交搜索后,我希望根据搜索结果更新类别和文章计数列表。

我无法理解为什么会出现此错误:

undefined method `where' for #<Article:0x007f1e60f193e0>

browse.html.erb

  <% @categories.each do |category| %>
    <p><%= link_to category.name, browse_articles_path(category: category.name) %></p>
    <p><%= category.articles.select{|article| article.where(title == params[:q][:title_cont])}.count %></p>
  <% end %>

articles_controller.rb

  def browse
    @q = Article.ransack(params[:q])
    @articles = @q.result.includes(:categories, :users)
    if params[:q][:title_cont] == present?
      @categories = Category.joins(:articles).where('article.title LIKE ?', params[:q][:title_cont]).uniq
    else
      @categories = Category.includes(:articles).order('name ASC').all
    end
  end

3 个答案:

答案 0 :(得分:1)

在Rails中where是一个ActiveRecord方法,一个用于从数据库中检索数据的查询接口。在您的示例中,您必须改为:

<%= category.articles.where(title: params[:q][:title_cont]).count %>

Active Record Query Interface

答案 1 :(得分:0)

黛安娜!

您正在使用select on articles数组并将article变量传递给块。 article变量只包含一个简单的文章。该对象没有.where方法。

重写:

category.articles.select{|article| article.where(title == params[:q][:title_cont])}.count

要:

category.articles.ransack(params[:q]).result.count

但是这段代码仍然可以重构和改进很多。你能分享完整的观点吗?

<强>被修改

category.articles.where(title: params[:q][:title_cont]).count

这是一个糟糕的解决方案,因为它会检查标题完全相同的文章,而您正在寻找标题包含params[:q][:title_cont]子字符串的文章。

答案 2 :(得分:0)

为什么?

您正在尝试执行Article对象的条件,而不是文章关系。

替换

<p><%= category.articles.select{|article| article.where(title == params[:q][:title_cont])}.count %></p>

<p><%= category.articles.select{|article| article.class.where(title == params[:q][:title_cont])}.count %></p>

OR

正确的方法

<p><%= category.articles.where(title: params[:q][:title_cont]).count %></p>