2013-06-03 4 views
1

j'ai les trois modèles suivants:Valider méthode Rails délégués

class Team < ActiveRecord::Model 
    has_many :teams_players 
    has_many :players, :through => :teams_players 
end 

class TeamsPlayer < ActiveRecord::Model 
    belongs_to :team 
    belongs_to :player 

    delegate :position, :to => :player 
end 

class Player < ActiveRecord::Model 
    has_many :teams_players 
    has_many :teams, :through => :teams_players 

    # the database attribute 'position' exists on Player 
end 

Une équipe peut avoir plusieurs joueurs et un joueur peut appartenir à plusieurs équipes. Cependant, une équipe ne peut avoir qu'un seul joueur avec la position 'kicker'.

Comment puis-je créer cette validation unique?

J'ai essayé d'ajouter une validation sur TeamsPlayer comme ceci:

validates :position, :uniqueness => { :scope => {:team_id} } 

Mais lors de la validation, rails exécute une requête de vérification de la colonne type sur la table de base de données TeamsPlayer. Au lieu de cela, je veux qu'il reconnaisse que c'est une méthode déléguée et vérifie à la place sur la table de base de données Player.

Répondre

0

Ce n'est pas une validation sur Player, il est un custom validation sur Team

+0

Pourquoi serait-il sur le '' Team' et non TeamsPlayer'? Si je le mets sur 'Team', ne pourrais-je pas ajouter autant de joueurs avec la même position que je veux? Je viens d'exposer un formulaire pour créer des objets 'TeamsPlayer' – Brian

+0

Lors de la validation d'une contrainte comme X ne peut avoir qu'un Y, j'ai mis la validation sur X, donc je mettrais la validation sur' Team' pour vérifier qu'elle a seulement 'has' zéro ou un kickers. Je suppose que vous pourriez mettre une validation sur 'TeamsPlayer', je ne l'ai jamais essayé. –

+0

Je crée/édite/détruis le modèle de jointure en utilisant son propre contrôleur, donc je ne pense pas que je puisse mettre la validation sur X. Je pense qu'ils ne fonctionneraient que si j'essayais de modifier X, ce que je ne suis pas. – Brian