2011-05-15 1 views
0

J'ai une classe parente dans les rails qui hérite de ActiveRecord :: Base. Je suis en train de mettre en œuvre une recherche de texte libre, ainsi que d'autres requêtes, dans cette classe de telle sorte que toutes les classes qui en héritent peuvent utiliser avec leurs propres champs, qui changent en fonction du modèle:Comment créer une propriété attr set comme dans superclasse, et remplir dans les sous-classes?

# 
# in base class 
# 
class GenericBase < ActiveRecord::Base 

    named_scope :freetext, lambda { |query| 
    if query.present? 
     { :conditions => [ self.freetext_fields.join(' LIKE ? or '), 
         (["%#{query}%"]*self.freetext_fields.size) ].flatten } 
    else 
     {} 
    end 
    } 

end 

# 
# in inheriting class 
# 
class Person < GenericBase 
    set_freetext_fields %w(firstname lastname username email)  
end 

# or 
class Address < GenericBase 
    set_freetext_fields %w(street city)  
end 

# 
# in controller 
# 
def search 
    @people = Person.freetext(params[:query]) 
end 

Dans l'exemple ci-dessus, comment puis-je implémenter le setter set_freetext_fields pour être facilement utilisé dans tous les modèles qui héritent de GenericBase? Cela devrait être quelque chose de très similaire à set_table_name disponible dans Rails.

Je veux l'implémenter dans le module parent ou un module mixin de sorte que l'API pour hériter des classes soit aussi propre que possible.

Répondre

1

Vous pouvez mettre en œuvre quelque chose comme ceci:

module A 
    def set_freetext_fields=(*args) 
    @a = args 
    end 

    def some_meth 
    @a 
    end 
end 

class C 
extend A 

C.set_freetext_fields = %w(firstname lastname username email) 
end 

puts C.set_freetext_fields 

C est GenericBase classe

+0

Bon appel, c'est ce qui a fini par travailler. Merci. – sa125

+0

Oui, je suis content de t'avoir aidé. Mais voici une chose que je ne peux pas comprendre complètement: si vous appelez set_freetext_fields en classe C sans C. explicite, vos devoirs ne seront pas visibles en dehors de la classe, et je ne comprends pas pourquoi :) – bor1s

Questions connexes