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

问题描述:

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

我无法理解为什么会发生错误:

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 

黛安娜!

您正在使用select数组并将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]子文章。

+0

您确定@diana正在查找匹配的子字符串吗?如果是这样的话,他将不得不使用通配符。 – Cyzanfar

+1

我不能确定,但​​是ransack title_cont是通配符匹配。如果她正在寻找完全匹配,她会用title_eq去。 PS:我不确定,但我认为戴安娜是一个女孩:) – AntonTkachov

在Rails where是方法,用于从数据库检索数据的uery界面。在您的例子中,你不得不这样做,而不是:

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

Active Record Query Interface

为什么?

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

要么更换

<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>