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.
Bon appel, c'est ce qui a fini par travailler. Merci. – sa125
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