2012-08-07 5 views
3

J'ai une classe Assignment qui appartient à la fois à une classe User et à une classe Role. Il stocke trois valeurs - une référence à l'utilisateur auquel il appartient, une référence au rôle auquel il appartient et une valeur de chaîne indiquant le nom de l'utilisateur qui crée l'instance d'affectation.Rails - Validation d'un attribut basé sur un autre modèle

class Assignment < ActiveRecord::Base 
    include ActiveModel::Validations 

    belongs_to :user 
    belongs_to :role 

    attr_accessible :user, :role, :assigned_by_user 

    ... 

Dans ma validation de modèle, je voudrais effectuer une vérification pour vous assurer que l'attribut assigned_by_user ne correspond au nom d'un utilisateur valide. Cependant, je n'arrive pas à accéder à la méthode User.find (...) dans le modèle Assignment.

Comment pourrais-je obtenir cette fonctionnalité? Ajoutez un module "Check User" à votre dossier lib (check_user.rb).

+0

sûr que vous pouvez! Quelle est l'erreur que vous obtenez? – phoet

Répondre

7

Ensuite, dans ce fichier

module CheckUser 

def search_user 
    user = User.find_by_name(self.assigned_by_user) 
    unless item.nil? 
    errors.add(:name_found, "This username has already been taken") 
    end 
end 

ensuite dans votre modèle d'affectation

class Assignment < ActiveRecord::Base 
    include CheckUser 
    validate :search_user 
+0

Oh, génial, ça a fonctionné beaucoup mieux que la solution hacky que j'ai mise ensemble la nuit dernière. – Bryce

+1

En guise de note supplémentaire: Vous pouvez également simplement ajouter une méthode similaire dans votre modèle et l'appeler ici plutôt que de le lancer dans un fichier entièrement différent. –

Questions connexes