Ruby on rails Texticle和ACTSASTAGABLEON

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

我正在尝试实现对标签的搜索,作为Texticle搜索的一部分。由于texticle不会搜索同一模型中的多个表,因此我根据texticle关于系统范围搜索的建议,创建了一个名为PostSearch的新模型

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的创建者来调查“为什么”。