sunspot_solr - NoMethodError(未定义的方法`result ='代表nil:NilClass)

时间:2012-09-06 14:45:35

标签: ruby-on-rails-3 full-text-search search-engine sunspot sunspot-solr

我遇到与使用sunspot_solr有关的问题。我有一个应用程序,使用此gem执行一些搜索。有5个型号具有此功能,其中只有1个在

中显示错误
 @search.results

NoMethodError (undefined method `result=' for nil:NilClass):
  app/controllers/financial_dashboards_controller.rb:27:in `index'

这是我的代码:

控制器

@search = Sunspot.search(Purchase) do
   fulltext params[:search]
   with(:product_owner).equal_to(current_user.id)
   facet(:status)
   if params[:status].present?
      with(:status).equal_to(params[:status]) 
   end
   facet(:sell_date)
   if params[:sell_date].present?
      with(:sell_date).equal_to(params[:sell_date])
   end
   order_by(:sell_date, :desc)
end

#line 27
@sales = @search.results.paginate(:page => params[:page], :per_page => 5)

模特(购买):

searchable do
  text :product_name
  text :product_short_description
  integer :product_owner
  string :status
  string :sell_date
end         

def product_name
  product.name
end

def product_short_description
  product.short_description
end

def product_owner
  product.user.id
end

def sell_date
  date.to_s(:year_month)
end

#indicates status of the payment and delivery
def status()
    if !self.closed.nil?
    I18n.t('purchases.status.finished')
    elsif !self.measured.nil?
    I18n.t('purchases.status.measured')
    elsif !self.accomplished.nil?
    I18n.t('purchases.status.delivered')
    elsif !self.paid.nil?
    I18n.t('purchases.status.paid')
    elsif !self.canceled.nil?
    I18n.t('purchases.status.canceled')
    elsif !self.date.nil?
    I18n.t('purchases.status.waiting_payment')
    end
end

另一个奇怪的事情是,在我的开发机器上,这段代码完美无缺。在使用nginx的生产计算机上,代码显示此错误。

我检查了宝石的版本并且匹配。我试过了

rake sunspot:solr:reindex RAILS_ENV=production

重新索引。我试过了

rake sunspot:solr:stop RAILS_ENV=production
rake sunspot:solr:start RAILS_ENV=production

重新启动搜索服务器。甚至尝试删除solr /文件夹并让启动脚本再次复制它。

为什么其他型号完美运作?任何想法如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:1)

就我而言,这是一个关键字段(id)不唯一的情况。

之所以发生这种情况,是因为我设计了一个带有非独特id字段的mysql视图。

这就是为什么在下一个非唯一行指数化过程中,太阳黑子总是“下降”首次命中为零。

所以

hit.result = result

在太阳黑子宝石代码中出现错误

当我弄明白时(我花了几个小时),我只是让我的id字段独一无二,重新编制了我的模型并且问题已经消失了。