2011-10-04 79 views
2

我有产品模型,类别模型和product_categorization模型(has_many ...,通过关联)。我正在使用meta_search gem来进行产品搜索。出于某种原因,即使我的日志正在拉动正确的标准,但不会根据类别过滤产品。无论我选择什么,它总是显示所有的产品。rails - meta_search无法正确筛选结果

产品控制器:

def update 
params[:product][:category_ids] ||= [] 
@product = Product.find(params[:id]) 
if @product.update_attributes(params[:product]) 
redirect_to @product 
else 
render "edit" 
end 

产品搜索表单:

<div class="field"> 
    <%= f.label :category %> 
    <%= f.collection_select :product_categorizations_category_id_equals_any, Category.all, :id, :name, :include_blank => true, :prompt => "Select a category" %> 
    </div> 

任何帮助,将不胜感激。另外,有没有更好的宝石可以使用?我知道searchlogic不是rails 3兼容,除非你得到补丁。 searchlogic的补丁版本是否比meta_search更好?谢谢。

UPDATE:解决:

的sooo很多时间琢磨这个过之后,我想通了。我不确定这是否是解释,但是*从“:product_categorizations_category_id_equals_any”*中删除“any”后,我才能使用它。我认为原因是因为这是一个通过关联的has_many,category_id不是作为数组存储的,所以“any”不相关。我的解释可能完全失效,但它的工作原理。

回答

1

meta_search应该可以通过关联(例如habtm)为has_many正常工作,例如,我有一个用户有很多球队模型,其中:

class User < ActiveRecord::Base 
    has_many :users_teams, :class_name => 'UsersTeams', :dependent => :destroy 
    has_many :teams, :through => :users_teams 
end 

以下所有返回正确过滤结果中所有:

User.search :teams_id_equals=>999 
User.search :users_teams_team_id_equals=>999 
User.search :teams_id_equals_any=>[999] 
User.search :users_teams_team_id_equals_any=>[999] 

我怀疑你的问题可能不会meta_search本身,而是其他原因(如表单参数未被正确接收并传递给搜索,或者关联未正确定义)。

建议您首先在模型级别验证搜索(或者在控制台中使用类似上述查询的控制台;但最好在您的项目中为此进行测试)。接下来将确保参数正确接收并传递到搜索。

+0

感谢您的回复。它实际上只是要求我从“product_categorizations_category_id_equals_any”中删除“any”。我认为只有有数组时才有必要这样做?不确定。 – noob

+0

ahah,这很有道理!是的,_any需要一个数组,就像你有一个多选列表一样 – tardate