2012-06-28 5 views
1

Je vous écris une application avec les modèles et les associations suivantes:Validation des grands-parents: deux parents ont le même parent?

class Company < ActiveRecord::Base 
    has_many :customers, :dependent => :destroy 
    has_many :goals, :dependent => :destroy 
end 

class Customer < ActiveRecord::Base 
    belongs_to :company 
    has_many :tasks 
    has_many :goals, through: :tasks 
end 

class Goal < ActiveRecord::Base 
    has_many :tasks, :dependent => :destroy 
    belongs_to :company 
    has_many :customers, through: :tasks 
end 

class Task < ActiveRecord::Base 
    belongs_to :goal 
    belongs_to :customer 
end 

maintenant dans la vue, un form_for une nouvelle tâche a déjà l'objectif ou le client sélectionné et l'autre association select est un ensemble filtré en fonction sur l'autre modèle. Théoriquement, il est impossible pour l'utilisateur de créer une tâche sous deux sociétés différentes, c'est-à-dire la société @ task.goal.company == @ task.customer.company.

Mais il semble être une bonne pratique d'avoir une validation pour vérifier qu'il n'y a qu'un seul grand-parent. Je comprends en utilisant un Proc.new que vous pouvez valider si un certain critère est rencontré mais je veux qu'il soit toujours validé donc ce n'est pas la solution que je cherche.

Merci. BTW laissez-moi savoir si la structure du modèle semble ridicules ou si j'ai fait quelque chose clairement contre la convention des rails.

Répondre

0

Un proc.new et une méthode sont exactement équivalents en termes de validation. Cela dit, vous cherchez probablement quelque chose comme ceci:

class Task < ActiveRecord::Base 
    belongs_to :goal 
    belongs_to :customer 

    validate :companies_match 

    private 

    def companies_match 
    self.errors.add(:base, "Goal company and customer company must be equivalent") unless goal.company == customer.company 
    end 
end 
+0

Cela a fonctionné parfaitement. Juste au cas où quelqu'un d'autre viendrait chercher une réponse, vous avez évidemment besoin d'un if/unless pour appeler l'erreur: ' ' –

+0

J'ai en fait cela dans le code, faites défiler vers la droite pour le voir. :) – Veraticus

+0

Doh! Donc vous faites, désolé à ce sujet = D –

Questions connexes