2017-10-11 94 views
1

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

回答

0

黛安娜!

您正在使用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

1

在Rails where是方法,用於從數據庫檢索數據的uery界面。在您的例子中,你不得不這樣做,而不是:

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

Active Record Query Interface

0

爲什麼?

您正在嘗試執行文章對象的條件,而不是文章關係。

要麼更換

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