Rails和Sunspot方面和过滤

这里几乎是一个noobie,所以我感谢任何人可以给予的帮助。

我正试图通过太阳黑子在我的网站上添加分面。 Ryan刚刚发布了一个很棒的Railscast,它让我开始: http : //railscasts.com/episodes/278-search-with-sunspot 。 我得到了它的工作,并能够添加其他方面。 我的问题是方面彼此独立。 如果我在3个不同的属性上有3个方面,当我选择了一个已经选中的方面时,我想只显示落入这两个方面的结果。 截至目前,它只是从一个方面切换到另一个方面。 我觉得这不应该那么困难,但我无法弄清楚如何去做。

我确实找到了这个教程: http : //blog.upubly.com/2011/01/06/using-sunspot-in-your-views/我觉得这样做我想要的。 我试图让这个工作,但是,即使我试图让它只用一个方面工作,我没有列出任何结果。 只是小平面的名称,然后没有别的。

思考?

谢谢!!

UPDATE

以下是我要做的代码示例:

调整Railscasts代码我得到了这个:

在我的StylesController中:

def index @search = Style.search do fulltext params[:search] facet :departmental, :seasonal, :classifier with(:departmental, params[:department]) if params[:department].present? with(:classifier, params[:classification]) if params[:classification].present? with(:seasonal, params[:season]) if params[:season].present? end 

在我的样式索引视图中(我知道我需要浓缩这个)

  = form_tag styles_path, :method => :get do %p = text_field_tag :search, params[:search] = submit_tag "Search", :name => nil #facets %h4 Departments %ul - for row in @search.facet(:departmental).rows %li - if params[:department].blank? = link_to row.value, :department => row.value (#{row.count}) - else %strong= row.value (#{link_to "remove", :department => nil}) %h4 Classifications %ul - for row in @search.facet(:classifier).rows %li - if params[:classification].blank? = link_to row.value, :classification => row.value (#{row.count}) - else %strong= row.value (#{link_to "remove", :classification => nil}) %h4 Seasons %ul - for row in @search.facet(:seasonal).rows %li - if params[:season].blank? = link_to row.value, :season => row.value (#{row.count}) - else %strong= row.value (#{link_to "remove", :season => nil}) 

在我的风格模型中:

  searchable do text :number, :description, :department, :classification, :season string :departmental string :classifier string :seasonal end def departmental self.department end def classifier self.classification end def seasonal self.season end 

我的版本的upubly代码配对,试图让“季节性”方面工作:

我离开搜索部分,搜索模型和SearchHelper与示例中的相同。 我试图弄乱Helper,因为我的Facets将提取文本值,而不仅仅是其他模型的ID,但无济于事。 我没有将各种属性设置为单独的模型,因为我认为我不需要这些function,但我开始认为不是这样。

StylesController:

  def index @title = "All styles" @search = search = Search.new(params[:search]) # need to set local variable to pass into search method @search.url = styles_path @search.facets = [:seasonal] @solr_search = Style.search do keywords search.query with(:seasonal, true) search.facets.each do |item| facet(item) with(:seasonal, params[:season]) if params[:season].present? end any_of do # filter by facets search.facets.each do |item| with(item).all_of( params[item].try(:split, "-") ) if params[item].present? end end paginate(:page => params[:page], :per_page => 10) end 

我再次感谢你的帮助。 肯定是一个菜鸟,但真正享受建立这个网站的过程。 Stackoverflow对我来说已经是一个巨大的帮助,所以我欠每个在这里发布答案的人都非常感谢你。

我自己需要答案,看到网上似乎没有别的东西,我决定自己想弄明白。

首先我通过逻辑得出结论,控制器可以处理多个方面,并且没有理由它不能,我记得关于ruby的最好的部分是它是最人性化的代码,尝试读取你的第一个控制器而你’我会发现它有效是有意义的。 我通过手动输入url中的查询字符串来测试这一点,该字符串返回了预期的结果。 因此,一旦我想到这一点,我就知​​道这个问题存在于我的观点中(这使我成为facepalm,因为它现在相当明显)

你的例子比我的复杂得多,我的答案可能不会100%满足每个要求,但我很确定它很接近。 此外,您的模型中有关“部门”等的代码在我看来有点多余

调节器

 def index @search = Style.search do fulltext params[:search] facet :departmental, :seasonal, :classifier with(:departmental, params[:department]) if params[:department].present? with(:classifier, params[:classification]) if params[:classification].present? with(:seasonal, params[:season]) if params[:season].present? end 

视图

 %h4 Departments %ul - for row in @search.facet(:departmental).rows %li - if params[:department].blank? = link_to row.value, styles_path( :department => row.value, :classification => (params[:classification] unless params[:season].blank?), :season => (params[:season] unless params[:season].blank?)) (#{row.count}) - else %strong= row.value = link_to "remove", styles_path( :department => nil, :classification => (params[:classification] unless params[:season].blank?), :season => (params[:season] unless params[:season].blank?))