donc je configure des modèles et ils sont basés sur 2 classes de base abstraites (ou plutôt ils étaient des classes). Après avoir rencontré beaucoup de problèmes avec la manipulation de STI par Datamapper pour mon cas d'utilisation, qui semble être un bug ouvert sur leur page phare, j'ai plutôt décidé de faire des modules pour définir toutes les propriétés pour garder mes modèles DRY. Malheureusement, j'ai un problème de portée, et ce qui complique les choses, c'est que je dois utiliser deux niveaux d'héritage. Voici mon code:En utilisant des modules pour définir des propriétés avec Datamapper
module Part
def self.included(receiver)
receiver.class_eval do
include DataMapper::Resource
property :id, Serial
#other junk
end
end
end
module HardDrive
def self.included(receiver)
receiver.class_eval do
include Part
property :kind, Enum[:magnetic, :flash]
#buncha crap here
end
end
end
class Fujitsu
include HardDrive
property :rev, String
end
L'erreur que je reçois est:
uninitialized constant HardDrive::Enum (NameError)
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:80:in `const_missing'
from ./app/models/hard_drive.rb:6:in `included'
from ./app/models/hard_drive.rb:4:in `class_eval'
from ./app/models/hard_drive.rb:4:in `included'
from ./app/models/hard_drives/fujitsu.rb:2:in `include'
from ./app/models/hard_drives/fujitsu.rb:2
Je suis un peu perdu. Quelqu'un sait-il comment je pourrais résoudre ceci ou mieux encore, une manière plus intelligente que je pourrais faire ceci?
J'voudrais seulement d'utiliser une partie ou HardDrive pour moteurs de recherche, pour que je puisse faire Part.all puis rendre vues basé sur cela, mais ce n'est pas une grosse perte. J'ai essayé d'utiliser l'héritage, mais pour autant que je sache, je ne peux pas utiliser l'héritage ruby et l'utiliser pour utiliser des tables différentes pour les sous-classes. J'ai d'abord conçu cela avec STI comme je l'ai dit mais il y a un bug connu dans DM sur leur page de phare qui empêche cela. Quelle stratégie utiliseriez-vous? – Technocrat