2016-01-12 8 views
0

On Rails 4. Я делаю сайт с продуктами. Эти продукты могут иметь множество тегов. Модели:Ruby on Rails - link_to с тегом filter

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

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

Я пытаюсь сделать заявку по всей Navbar, где пользователь может нажать каждую навигационную ссылку, чтобы принять его/ее к индексу продукции, а продукты будут фильтроваться по имени тега из ссылка. До сих пор я на самом деле это работает:

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 

(«еще» часть использует Ransack, есть также форма внутри заголовка для ввода условий поиска, если вы не хотите использовать навигационные ссылки).

Моя проблема возникает, когда Я хочу вернуть продукты, которые имеют TWO теги, для которых я хочу фильтровать. Например, допустим, у меня есть теги «Синий» и «Карандаши», и я хотел создать ссылку, которая найдет все продукты Blue Pencil. Я пробовал несколько вещей, в том числе экспериментировал с .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

Это хорошая мысль, не так подумайте о двух разных местах. Однако это не работает, оно ничего не возвращает, когда я пытаюсь (без ошибок, просто нет каких-либо продуктов) ... не знаю, почему ... будет продолжать пробовать несколько вещей. – Rachel9494

+0

Да, правильно, я думаю, что это не сработает ... вы можете попробовать с 'includes' вместо' joins'? ... Я утончаю объединение делает ленивую загрузку только соответствующей записи тега, но включает в себя все записи тегов. Или я могу просто поговорить через мою шляпу ... – SteveTurczyn

+0

Спасибо, что продолжали мне помогать! Попытка «включает» тоже не работала ... должно быть, еще не хватает части головоломки. – Rachel9494

Смежные вопросы