我正在尝试将标记搜索作为Texticle搜索的一部分。由于texticle不会搜索来自同一模型的多个表,因此我最终创建了一个名为PostSearch的新模型,遵循Texticle关于全系统搜索的建议
class PostSearch < ActiveRecord::Base
# We want to reference various models
belongs_to :searchable, :polymorphic => true
# Wish we could eliminate n + 1 query problems,
# but we can't include polymorphic models when
# using scopes to search in Rails 3
# default_scope :include => :searchable
# Search.new('query') to search for 'query'
# across searchable models
def self.new(query)
debugger
query = query.to_s
return [] if query.empty?
self.search(query).map!(&:searchable)
#self.search(query) <-- this works, not sure why I shouldn't use it.
end
# Search records are never modified
def readonly?; true; end
# Our view doesn't have primary keys, so we need
# to be explicit about how to tell different search
# results apart; without this, we can't use :include
# to avoid n + 1 query problems
def hash
id.hash
end
def eql?(result)
id == result.id
end
end
在我的Postgres DB中,我创建了一个这样的视图:
CREATE VIEW post_searches AS
SELECT posts.id, posts.name, string_agg(tags.name, ', ') AS tags
FROM posts
LEFT JOIN taggings ON taggings.taggable_id = posts.id
LEFT JOIN tags ON taggings.tag_id = tags.id
GROUP BY posts.id;
这允许我得到这样的帖子:
SELECT * FROM post_searches
id | name | tags
1 Intro introduction, funny, nice
所以看起来应该都很好。不幸打电话 PostSearch.new(“funny”)返回[nil](NOT [])。通过Texticle源代码查看,看起来像PostSearch.new中的这一行
self.search(query).map!(&:searchable)
使用某种searchable_columns方法映射字段,并且做错了吗?结果为零。
另一方面,除非我将文本类型转换为varchar类型,否则不会在texticle SQL查询中搜索tags字段。
所以,总结一下: 为什么在找到对象时会将其映射到nil?
和
为什么texticle会忽略我的标签字段,除非它是varchar?
答案 0 :(得分:1)
Texticle将对象映射到nil
而不是任何内容,以便您可以检查nil?
- 这是防止错误检查不存在的项目的安全措施。可能值得tenderlove自己问他为什么这样做。
对于为什么Texticle忽略非varchars,我并不完全正面,但是it looks like这是一个性能保护措施,以便Postgres不进行全表扫描(在创建超高速索引<< /强>):
您需要为查询的每个文本/字符串列添加索引,否则Postgresql将恢复为全表扫描而不是使用索引。