2016-01-12 147 views
0

On Rails 4.我正在製作一個帶有產品的網站。這些產品可以有很多標籤。型號:Ruby on Rails - link_to帶標籤過濾器

class Product < ActiveRecord::Base 
    has_many :tags, through: :product_tags 

class Tag < ActiveRecord::Base 
    has_many :products, through: :product_tags 

我試圖讓一個應用廣泛的導航欄,其中用戶可以單擊每個導航鏈接帶他/她到產品指標,產品將被過濾根據從標籤名鏈接。到目前爲止,我確實有這方面的工作:

application.html.erb 

<li><%= link_to "Pencils", products_path(tag: "Pencils") %></li> 


products_controller.rb 

def index 
    if params[:tag] 
     @products = Product.joins(:tags).order('id').page(params[:page]).per(20).where(tags: { name: params[:tag] }) 
    else 
     @products = @q.result(distinct: true).order('id').page(params[:page]).per(20) 
    end 

    end 

(在「其他」部分使用搜查,也有標題中輸入搜索詞裏面的表單,如果你不希望使用的導航鏈接)。

我的麻煩來了我想返回有兩個標籤我想過濾的產品。例如,假設我的標籤是「藍色」和「鉛筆」,我想製作一個link_to,可以找到所有藍色鉛筆產品。我嘗試了一些東西,包括嘗試使用.split(),但無法獲得我需要的結果。如果有其他方法,不想在這裏使用寶石。謝謝你的幫助!

回答

2

你可以通過兩個標籤...

<li><%= link_to "Blue Pencils", products_path(tag: "Pencils", tag2: "Blue") %></li> 

...然後你應該能夠使用多個where條款...

def index# 
    if params[:tag2] 
    @products = Product.joins(:tags).order('id').page(params[:page]).per(20).where(tags: { name: params[:tag] }).where(tags: { name: params[:tag2] }) 
    elsif params[:tag] 
    @products = Product.joins(:tags).order('id').page(params[:page]).per(20).where(tags: { name: params[:tag] }) 
    else 
    @products = @q.result(distinct: true).order('id').page(params[:page]).per(20) 
    end 
end 
+0

這是一個很好的想法,沒考慮兩個不同的where子句。這是行不通的,當我嘗試它時沒有任何返回(沒有錯誤,只是沒有列出任何產品)......不知道爲什麼...會繼續嘗試幾件事。 – Rachel9494

+0

是的,對,我認爲它不會工作......你可以用'includes'而不是'joins'來嘗試嗎? ...我細化連接只會匹配標記記錄的延遲加載,但包括應包含所有標記記錄。或者我可以通過我的帽子說話... – SteveTurczyn

+0

謝謝你繼續幫助我!嘗試「包括」也沒有工作......必須缺少一塊難題。 – Rachel9494