7
votes

Modèle Rails avec plusieurs instances d'un seul modèle 'has_one "

J'essaie de faire un modèle de rails contenant deux attributs différents "has_one" de la même classe. Je me sens comme un moyen plus facile de le faire, mais je ne peux pas y penser maintenant.

Donc, disons que je voudrais créer un modèle de mariage dans les rails xxx < / Pré>

Mon objectif est d'avoir accès à l'objet Groom de l'objet de mariage. (Être capable d'appeler @ wedding.groom.name ou autre) Il n'y a aucun moyen pour le modèle de mariage de savoir quelle "personne" est la mariée et qui est le marié. < p> Dois-je utiliser une table unique de table? Ou devrais-je utiliser des clés étrangères?

Y a-t-il un meilleur moyen de penser à tout le problème?


0 commentaires

3 Réponses :


2
votes

Changer personne code> à participant code> et donnez-le un rôle code> attribut. Ensuite, vous pouvez faire

class Wedding < ActiveRecord::Base
  has_one :groom, :class_name => 'Participant', :condition => "role = 'groom'"
  has_one :bride, :class_name => 'Participant', :condition => "role = 'bride'"
end


2 commentaires

Hmm .. : condition est un bon appel. C'est peut-être ce que je cherche. Disons que j'ai un marié qui est un "participant". J'ai ensuite défini @ wedding.groom = groom et sauvegardez le mariage. Quand je charge ensuite le mariage et appelez @ wedding.groom.name , va-t-il / savoir / quel objet participant je veux?


Oui. Le contenu de la condition: la condition devient la clause SQL lorsque cela va charger le marié.



1
votes

Selon la différence qu'ils seront traités dans le domaine, il peut y avoir rien de mal à l'approche que vous avez prise.

Dans l'éventualité que le "marié" et "mariée" ne nomme principalement des conventions qui sont généralement traitées de manière égale, il peut être plus sage de simplement faire un has_many: parties relation et laissez la personne Modèle Déterminez lequel est la mariée / le marié. Peut-être quelque chose comme ceci: xxx


1 commentaires

Wow, toutes ces réponses ressemblent à ce qu'ils travailleraient. Je suppose que j'ai la décision de faire.



9
votes

Vos associations sont à l'envers pour la fonctionnalité que vous souhaitez ..

class Wedding < ActiveRecord::Base
  belongs_to :groom, :class_name => 'Person'
  belongs_to :bride, :class_name => 'Person'
end

class Person < ActiveRecord::Base
  has_many :weddings  # who has just one wedding now days???
end

Wedding.find(params[:id]).groom.name

Person.find(params[:id]).weddings.last  # hopefully first also  :)


5 commentaires

"Qui a juste un mariage maintenant jours ???" - MDR. Je pense que l'intention est d'aider le planificateur de mariage, pas que les personnes individuelles gèrent leur vie ...


Je sais .. :) Je ne pouvais pas résister .. changer ce qui précède vers un has_one et nous pouvons tous croire que l'amour durera éternellement! :)


Je suppose que j'essayais d'éviter de mettre toutes les clés étrangères sur le modèle de mariage, mais vous avez raison, cela fonctionnerait.


Quelle était la raison de l'évitement? Mettez les clés étrangères où elles sont censées être! (Je n'ai été marié qu'une seule fois)


C'est le phrasé de ces choses qui me jette. Un mariage n'appartient pas à une personne, conceptuellement un mariage "has_one" mariée et le marié. Mais oui, la plupart de la solution la plus redresseur est de les renvoyer. Bonne réponse.