2010-03-18 42 views
0

我正在使用acts_as_solr在项目中进行搜索。不幸的是,保存模型时,索引似乎没有更新相关模型。acts_as_solr未更新Rails中的关联模型

例子:

我有三个型号:

class Merchant < ActiveRecord::Base 
    acts_as_solr :fields => [:name, :domain, :description], :include => [:coupons, :tags] 
    ... 
end 

class Coupon < ActiveRecord::Base 
    acts_as_solr :fields => [:store_name, :url, :code, :description] 
    ... 
end 

class Tag < ActiveRecord::Base 
    acts_as_solr :fields => [:name] 
    ... 
end 

我使用下面的行来执行搜索:虽然

Merchant.paginate_by_solr(params[:q], :per_page => PER_PAGE, :page => [(params[:page] || 1).to_i, 1].max) 

出于某种原因,在我添加优惠券在说明中包含“鞋”这个词,对“鞋”的查询不会返回与优惠券相关联的商家。该协会都工作,如果我运行耙子solr:reindex,搜索然后返回新的优惠券。

每次创建新优惠券时,是否需要更新Merchant的索引?我是否必须更新整个班级的索引,还是只需更新关联的商家?

不应该这样做自动?

回答

1

好的,结果发生了一些事情。

在优惠券的模式,我把一个after_save的回调函数来更新相关商家Solr的文档:

def update_merchant_solr 
    merchant.solr_save 
end 

标签问题是由于对acts_as_solr和i​​s_taggable的after_save的回调的顺序。商家after_save中的solr插入发生在is_taggable回调之前,因此,当调用商家solr回调来更新其文档时,标签尚未与其关联。切换订单工作:

class Merchant < ActiveRecord::Base 
    is_taggable :tags 
    acts_as_solr :fields => [:name, :domain, :description], :include => [:coupons, :tags] 
    ... 
end 
+0

在我的应用程序中,我用'model.touch'。 – jonnii 2010-03-21 00:55:21

1

我使用太阳黑子,所以可能会有差异,但我不得不在相关模型上设置回调以重新索引父记录。我猜你必须做同样的事情。

+0

是的,正如你可以从上面看到的,这就是我最终不得不做的。谢谢。 – 2010-03-20 14:36:20