使用思维狮身人面像并保持干爽(不要重复自己)

时间:2010-12-21 21:57:40

标签: ruby-on-rails dry thinking-sphinx

在我正在开展的大型项目中,我们有许多我们想要索引和搜索的模型。我发现自己一遍又一遍地重复着事......并且知道在我们做出改变之后这可能会很糟糕!

使用Thinking Sphinx时是否有一种保持代码干燥的好方法?特别是我想在每个模型中编写以下代码块:

define_index do
  ... # model specific code goes here
  set_property :delta => true
  has :created_at
end

sphinx_scope(:only_active) do
  { :conditions => { :status => 1 } }
end

我预计随着项目的发展,这个通用代码的大小和功能都会增加......更不用说可能有bug修复了。所以很明显我想要考虑到这一点。我希望能够做到这样的事情:

define_index_with_common_settings do
  ... # model specific code goes here
end

并且将公共索引属性自动包含在索引中...并且定义了与常见搜索相关的方法和范围。

这可能吗?怎么做?

1 个答案:

答案 0 :(得分:1)

你总是可以创建一个mixin来做到这一点:

module CommonSphinxIndexSettings
  extend ActiveSupport::Concern
  module ClassMethods
    def define_index_with_common_settings
      yield self
      set_property :delta => true
      has :created_at
    end

    sphinx_scope(:only_active) do
      { :conditions => { :status => 1 } }
    end
  end
end

然后添加初始化程序以将其包含在AR中:

ActiveRecord::Base.send :include, CommonSphinxIndexSettings

这应该让一切都干!

编辑:我做了一个小改动(将self传递给yield调用),这很重要,因为ThinkingSphinx正在使用的元编程类型。这个解决方案有它的局限性,但对大多数情况来说应该足够好了。