2010-12-21 10 views
3

In dem großen Projekt, an dem ich arbeite, haben wir viele Modelle, die wir indexieren und suchen möchten. Ich merke, dass ich immer wieder Dinge wiederhole ... und ich weiß, dass dies später schlecht sein kann, wenn wir Änderungen vornehmen!Verwenden von Thinking Sphinx und bleiben DRY (nicht wiederholen)

Gibt es eine gute Möglichkeit, Code DRY während Thinking Sphinx zu halten? Insbesondere habe ich den folgenden Code-Block in jedem Modell möchte ich Index:

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 

ich diesen gemeinsamen Code antizipieren in Größe und Funktionalität zu wachsen, da das Projekt ... entwickelt sich nicht zu erwähnen, dass es Fehlerbehebungen sein kann . Offensichtlich möchte ich das ausrechnen. Ich möchte in der Lage sein, etwas zu tun:

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

und haben die gemeinsame indizierte Attribute automatisch in den Index aufgenommen werden ... und haben gemeinsame Suche bezogenen Methoden und Bereiche definiert werden.

Ist das möglich? Wie wird es gemacht?

Antwort

1

Man konnte immer eine mixin schaffen, das zu tun:

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 

Dann einen Initialisierer hinzuzufügen in AR enthalten:

ActiveRecord::Base.send :include, CommonSphinxIndexSettings 

Dies sollte alles trocken halten!

Bearbeiten: Ich habe eine kleine Änderung vorgenommen (Übergabe an den Yield Call), das ist wichtig wegen der Art der Meta-Programmierung, die ThinkingSphinx verwendet. Diese Lösung hat ihre Grenzen, sollte aber in den meisten Fällen gut genug sein.