Texticle和ActsAsTaggableOn

时间:2012-04-26 20:02:54

标签: ruby-on-rails acts-as-taggable-on texticle

我正在尝试将标记搜索作为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?

1 个答案:

答案 0 :(得分:1)

Texticle将对象映射到nil而不是任何内容,以便您可以检查nil? - 这是防止错误检查不存在的项目的安全措施。可能值得tenderlove自己问他为什么这样做。

对于为什么Texticle忽略非varchars,我并不完全正面,但是it looks like这是一个性能保护措施,以便Postgres不进行全表扫描(在创建超高速索引<< /强>):

  

您需要为查询的每个文本/字符串列添加索引,否则Postgresql将恢复为全表扫描而不是使用索引。