我在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
答案 0 :(得分:1)
在Rails中where
是一个ActiveRecord
方法,一个用于从数据库中检索数据的查询接口。在您的示例中,您必须改为:
<%= category.articles.where(title: params[:q][:title_cont]).count %>
答案 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>
正确的方法
<p><%= category.articles.where(title: params[:q][:title_cont]).count %></p>