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]
子文章。
答
在Rails where
是方法,用于从数据库检索数据的uery界面。在您的例子中,你不得不这样做,而不是:
<%= category.articles.where(title: params[:q][:title_cont]).count %>
答
为什么?
您正在尝试执行文章对象的条件,而不是文章关系。
要么更换
<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>
您确定@diana正在查找匹配的子字符串吗?如果是这样的话,他将不得不使用通配符。 – Cyzanfar
我不能确定,但是ransack title_cont是通配符匹配。如果她正在寻找完全匹配,她会用title_eq去。 PS:我不确定,但我认为戴安娜是一个女孩:) – AntonTkachov