2010-12-02 29 views
0

En supposant que l'utilisateur a has_one: abonnement, l'abonnement appartient à: utilisateur et j'utilise accept_nested_attributes_for pour imbriquer les attributs d'abonnement dans le formulaire de création d'utilisateur, quelle est la meilleure façon de localiser et mettre à jour abonnement (s'il existe) basé sur User.email == Subscription.email?Comment mettre à jour l'attribut imbriqué existant sans FK

Notez que les abonnements existants pourraient avoir user_id = nul

Répondre

1

probablement ce que vous voulez faire est d'utiliser l'e-mail comme la clé étrangère:

class User < ActiveRecord::Base 
    has_one :subscription, :foreign_key => "email", :primary_key => "email" 
end 
+0

Hrm, ouais ... J'ai pensé à faire ça. Laisse-moi jouer avec cette idée. Merci. –

+0

Je l'ai fait de temps en temps. Fonctionne plutôt bien en dehors d'être une clé naturelle, ce qui signifie que vous allez rencontrer des problèmes lorsque les utilisateurs veulent changer leurs adresses e-mail. Assurez-vous simplement que vous avez un index sur l'email pour les deux tables. – karmajunkie

+0

Ok, j'ai configuré les associations mais je reçois toujours des enregistrements en double. J'ai update_only => true sur accept_nested_attributes_for. Des idées? –

0

Je suppose que cela devrait être divisé en un processus en deux étapes:

  1. Localisez l'utilisateur que vous souhaitez mettre à jour.
  2. Recherchez un abonnement (le cas échéant) avec l'adresse de messagerie de l'utilisateur. Définissez l'abonnement sur cet utilisateur pour cet enregistrement.
  3. Mettez à jour l'utilisateur normalement. Puisque l'association est maintenant présente (c'est-à-dire que user.subscription ne sera pas nul), les enregistrements d'abonnement seront mis à jour correctement.