Par exemple, maintenant si j'appelle utilisateur code> a une liste
code>,
list code> a beaucoup
article code> s, et j'ai ce qui suit Code dans le contrôleur:
@ user.save code>,
@List code> et 10
élément code> > S ne serait pas enregistré dans la base de données. Comment dois-je réécrire ce code? P> p>
6 Réponses :
Je pense que vous voulez dire Après cela, appeler @ user.list = @List code>. p>
@ user.save code> devrait tout sauver. p>
Mais si @List ne peut pas passer les validations, comment puis-je le savoir? @ user.save code> retourne toujours
true code> et
@ user.save! code> ne soulève rien.
Si vous avez de nombreuses listes d'un utilisateur, vous pouvez utiliser les listes HAS_MANY: Listes du modèle utilisateur. Ensuite, la table doit avoir une colonne user_id. P>
Dans le contrôleur, vous pouvez obtenir toutes les listes d'un utilisateur à l'aide de User.Listes qui retourneront la liste des listes de cet utilisateur. Vous pouvez ajouter plus de liste à l'utilisateur comme utilisateur.LISTES << NEW_LIST. P>
Je pense que c'est ce que vous cherchiez. P>
Vous pouvez configurer Activerecord à Cascade-Enregistrer les modifications des éléments d'une collection pour un modèle en ajoutant: autosave => option vraie lors de la déclaration de l'association. En savoir plus .
Exemple: P>
class Payment < ActiveRecord::Base belongs_to :cash_order, :autosave => true ... end
rails sait comment gérer cela. Il existe plusieurs manières en fonction de votre conception, et si je comprends bien, vous devez soulever une exception lorsqu'une erreur de validation se produit. Essayez ceci:
ActiveRecord::Base.transaction do @user = User.new(name: 'example') @user.create_list!(label: 'something') (1..10).each {|i| @user.list.items.create!(order: i) } @user.save! end
En configurant des associations et des validations appropriées Vous pouvez vous assurer que lorsque vous enregistrez l'utilisateur, la liste associée et les éléments sont enregistrés en même temps. De plus, vous pouvez vous assurer que tout est enregistré dans une seule transaction et que la sauvegarde sera abandonnée si un enregistrement d'enfant ne peut pas être enregistré.
Compte tenu des définitions de modèle suivantes pour l'utilisateur, la liste et l'élément P>
(0.2ms) BEGIN SQL (0.3ms) INSERT INTO `lists` (`name`) VALUES ('My list') SQL (0.1ms) INSERT INTO `items` (`list_id`, `name`) VALUES (4, 'Widget') SQL (0.3ms) INSERT INTO `users` (`list_id`) VALUES (4) (0.3ms) COMMIT
Notez que validateate_associated code> ne fonctionne pas avec
has_one code>. Pour cela, vous devriez écrire
has_one: classname, valide: true code>. Réf: apidock.com/rails/acterecord/validations/classmethods/.../a>
@Magne, ma solution n'utilise pas une association has_one code>. Est-ce ce que vous utilisez?
Oui, c'est ce que j'utilisais.
Vous pouvez utiliser accepter_nedes_attributes_for code> de sorte que lorsqu'un utilisateur reçoit une sauvegarde, ses enregistrements associés seront automatiquement modifiés. Veuillez passer à travers ceci ..... Accept_neDe_attributes_for et
Avez-vous trouvé une réponse pour cela?
@ Magne Oui, il est possible de sauvegarder des modèles récursivement. Si vous avez du mal à vérifier cela: API.RubyonRails.org/classes/acterecord/... s'il y a encore quelque chose de mal, puis postez vos modèles, associations et vos cas simples. L'article original n'a aucune information sur les relations des modèles.
Merci @flashgordon!
Après avoir appelé
@ user.save code>, y a-t-il des erreurs sur le modèle? C'est-à-dire quelle est la valeur de
@ user.Errors code> à ce point? Quelle est la valeur de
@ user.list.errors code>?