On Rails 4.我正在制作一个包含产品的网站。这些产品可以有很多标签。机型:
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
(“else”部分使用Ransack,如果您不想使用导航链接,标题内还有一个表单可输入搜索词。)
我的麻烦来自我想要退回我想过滤的有两个标签的产品。例如,假设我有“蓝色”和“铅笔”标签,我想制作找到所有Blue Pencil产品的link_to。我尝试了一些方法,包括尝试使用.split()但无法得到我需要的结果。如果有其他方式,不要在这里使用宝石。谢谢你的帮助!
答案 0 :(得分: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