Ruby on rails Texticle和ACTSASTAGABLEON
我正在尝试实现对标签的搜索,作为Texticle搜索的一部分。由于texticle不会搜索同一模型中的多个表,因此我根据texticle关于系统范围搜索的建议,创建了一个名为PostSearch的新模型Ruby on rails Texticle和ACTSASTAGABLEON,ruby-on-rails,acts-as-taggable-on,texticle,Ruby On Rails,Acts As Taggable On,Texticle,我正在尝试实现对标签的搜索,作为Texticle搜索的一部分。由于texticle不会搜索同一模型中的多个表,因此我根据texticle关于系统范围搜索的建议,创建了一个名为PostSearch的新模型 class PostSearch < ActiveRecord::Base # We want to reference various models belongs_to :searchable, :polymorphic => true # Wish we coul
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
这让我可以得到如下帖子:
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
看来这一切都没问题。不幸的是
new(“fully”)返回[nil](而不是[])。查看Texticle源代码,它看起来像PostSearch.new中的这一行
self.search(query).map!(&:searchable)
使用某种可搜索的_列方法映射字段,是否不正确?结果是零分
另一方面,除非我将其从文本类型转换为varchar类型,否则不会在texticle SQL查询中搜索tags字段
因此,总而言之:
为什么在找到对象时将其映射为nil
及
为什么texticle会忽略我的标记字段,除非它是varchar?texticle将对象映射到
nil
,而不是什么都没有,这样您就可以检查nil?
——这是一种防止错误检出不存在的项目的保护措施。也许值得问问他自己,他为什么那样做
对于Texticle忽略非varchar的原因,我并不完全肯定,但这是一种性能保障,因此Postgres不会进行全表扫描(在为Super Speed创建索引一节下):
您需要为查询所针对的每个文本/字符串列添加索引,否则Postgresql将恢复为完整表扫描,而不是使用索引
Texticle将对象映射到
nil
,而不是空,这样您就可以检查nil?
——这是一种防止对不存在的项目进行错误检出的保护措施。也许值得问问他自己,他为什么那样做
对于Texticle忽略非varchar的原因,我并不完全肯定,但这是一种性能保障,因此Postgres不会进行全表扫描(在为Super Speed创建索引一节下):
您需要为查询所针对的每个文本/字符串列添加索引,否则Postgresql将恢复为完整表扫描,而不是使用索引
隐马尔可夫模型。。。但是我不能在视图上有索引,可以吗?另外,我想,将其设为nil背后的理由是有道理的,但是您知道为什么它实际上被映射到nil吗?视图是临时表,因此您不能直接对它们进行索引,但您可以对从中绘制视图的基础表进行索引。我不知道为什么它会被映射到
nil
,所以我建议你联系texticle的创建者来调查“为什么”。嗯。。。但是我不能在视图上有索引,可以吗?另外,我想,将其设为nil背后的理由是有道理的,但是您知道为什么它实际上被映射到nil吗?视图是临时表,因此您不能直接对它们进行索引,但您可以对从中绘制视图的基础表进行索引。我不知道为什么它会被映射到nil
,所以我建议你联系texticle的创建者来调查“为什么”。