2009-12-11 3 views
0

Alors disons que vous avezJe pense que cela doit être refactorisé - de l'aide? modélisation Ruby

line_items

et line_items appartenez à une marque et un modèle

une marque a de nombreux modèles et postes

un modèle appartient à une marque

Pour l'exemple nu idée LineItem.new (: make => "Apple",: modèle => "Mac Book Pro")

Lors de la création d'un objet LinteItem, vous voulez une zone text_field pour une marque et un modèle. Les marques et les modèles ne devraient pas exister plus d'une fois.

J'utilisé la mise en œuvre suivante:

before_save :find_or_create_make, :if => Proc.new {|line_item| line_item.make_title.present? } 
before_save :find_or_create_model 

def find_or_create_make 
    make = Make.find_or_create_by_title(self.make_title) 
    self.make = make 
end 

def find_or_create_model 
    model = Model.find_or_create_by_title(self.model_title) {|u| u.make = self.make} 
    self.model = model 
end 

Cependant, l'utilisation de cette méthode signifie que je dois validateurs personnalisés au lieu d'un #validates_presence_of: faire en raison des associations qui se produisent hors un attribut virtuel

validate :require_make_or_make_title, :require_model_or_model_title 

def require_make_or_make_title 
    errors.add_to_base("Must enter a make") unless (self.make || self.make_title) 
end 

def require_model_or_model_title 
    errors.add_to_base("Must enter a model") unless (self.model || self.model_title) 
end 

Meh, ça commence à être nul. Maintenant où vraiment suce édite avec des formes. Considérant que mes champs de formulaire sont partiels, mon édition rend le même formulaire que le nouveau. Cela signifie que: make_title et: model_title sont vides sur le formulaire.

Je ne suis pas vraiment sûr de la meilleure façon de rectifier le problème immédiatement ci-dessus, ce qui a été le dernier tournant sur moi en pensant que cela doit être entièrement refactorisé.

Si quelqu'un peut fournir des commentaires, ce serait génial.

Merci!

Répondre

1

Je ne pense pas que line_items devrait appartenir à un make, ils devraient seulement appartenir à un modèle. Et un modèle devrait avoir beaucoup d'éléments de ligne. Une marque peut avoir plusieurs éléments de ligne dans un modèle. Il vous manque quelques méthodes pour faire apparaître vos champs. Ce n'est vraiment pas si mauvais, il n'y a tout simplement pas moyen super facile de le faire. J'espère que vous mettez une saisie semi-automatique sur ces champs de texte à un moment donné.

Questions connexes