在我正在开展的大型项目中,我们有许多我们想要索引和搜索的模型。我发现自己一遍又一遍地重复着事......并且知道在我们做出改变之后这可能会很糟糕!
使用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
并且将公共索引属性自动包含在索引中...并且定义了与常见搜索相关的方法和范围。
这可能吗?怎么做?
答案 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正在使用的元编程类型。这个解决方案有它的局限性,但对大多数情况来说应该足够好了。