1

我有一个Item模型:

class Item < ActiveRecord::Base
...
define_index do
  ...
  has deleted_at
  indexes deleted_at
end
...

然后我停止服务器,运行rake ts:rebuild && rake ts:reindex && rake ts:restart,重新启动服务器。我仍然得到错误。

触发错误的查询是这样的:

Item.search({conditions:  {deleted_at: nil}})

怎么了 ?


注意:我正在使用acts_as_paranoid。我的数据库已迁移,表items中有列deleted_at

schema.rb 中的某处:

...
create_table "items", :force => true do |t|
  ...
  t.datetime "deleted_at"
4

1 回答 1

2

这里有几个相关的问题:

  • 您有一个属性和一个具有相同名称的字段 (deleted_at) - 您应该使用 :as 选项将一个别名命名为不同的名称。否则,Sphinx 在读取生成的 SQL 数据时会感到困惑。
  • 您有一个日期列作为字段,几乎可以肯定它不是必需的 - 您是否希望用户通过 deleted_at 进行搜索,还是纯粹由您在内部管理?我猜是后者。所以,删除indexes deleted_at线。
  • 您在搜索调用中设置了一个字段条件,而它实际上应该是一个属性过滤器 - 这是使用该:with选项完成的。
  • Sphinx 没有 nil 的概念,但应该将数据库中的 NULL 值转换为零。

因此,考虑到所有这些,您的索引定义应该是:

define_index do
  # ...

  has deleted_at
end

运行rake ts:rebuild以确保 Sphinx 知道更改并更新您的索引文件。

那么你的搜索电话是:

Item.search with: {deleted_at: 0}
于 2013-06-19T00:35:14.717 回答