Rails: possède et appartient à plusieurs (HABTM) - crée une association sans créer d'autres enregistrements
Passé toute la journée sur Google, mais ne pouvez pas trouver une réponse. :\
J'ai un HABTM relation entre les Utilisateurs et les Core_Values.
class CoreValue < ActiveRecord::Base
has_and_belongs_to_many :users
class User < ActiveRecord::Base
has_and_belongs_to_many :core_values
Dans mon contrôleur, j'ai besoin de faire deux choses distinctes:
- Si un CoreValue n'existe pas, créez-en un et de l'associer avec un id d'utilisateur et
- En supposant que je connais un particulier CoreValue n'existe pas déjà, la création de l'association sans en créer un nouveau CoreValues ou les Utilisateurs
Pour le # 1, j'ai obtenu ce travail:
User.find(current_user.id).core_values.create({:value => v, :created_by => current_user.id})
Cela crée un nouveau CoreValue avec :de la valeur et de l' :created_by et crée l'association.
Pour le # 2, j'ai essayé quelques petites choses, mais pas tout à paraître à la création de l'association.
Merci pour votre aide!
source d'informationauteur jmccartie
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire dans une procédure en deux étapes, à l'aide de la très utile
find_or_create
méthode.find_or_create
tentera d'abord de trouver un record, et si elle n'existe pas, créez-la. Quelque chose comme ceci devrait faire l'affaire:Quelques remarques:
v
. Si elle n'existe pas et est créé, il va mettre lecreated_by
àcurrent_user.id
.User.find(current_user.id)
car ce serait de retour sur le même objet quecurrent_user
.current_user.core_values
est un tableau, et vous pouvez facilement ajouter une autre valeur en utilisant<<
.Par souci de concision, le suivant serait le même que l'exemple de code ci-dessus:
Ajouter une méthode dans votre modèle d'utilisateur:
La
assign_core_value
méthode répond à l'exigence 1,2 et renvoie la valeur de base attribué à l'utilisateur (avec le nom).Maintenant, vous pouvez effectuer les opérations suivantes:
Note 1
Logique de la méthode est comme suit:
1) Vérifie si le CoreValue est déjà associé à l'utilisateur. Si aucune action n'est prise, la valeur est retournée.
2) Vérifie si le CoreValue avec le nom donné existe. Si pas crée la CoreValue. Les associés de la valeur fondamentale(créé/trouvé) avec l'utilisateur.
D'Enregistrement Active vous donne déjà une méthode. Dans votre cas,
Vous pouvez également passer un certain nombre d'objets à ceux de cette façon. Toutes les associations seront créés
Vérifier cette pour plus d'informations