2010-12-02 13 views
0

Unter der Annahme, Benutzer has_one: subscription, Subscription gehört_to: user, und ich benutze accept_nested_attributes_for Subskriptionsattribute in das Benutzererstellungsformular verschachteln, was ist der beste Weg zum Suchen und Aktualisieren und Existieren Abonnement (falls vorhanden) basierend auf User.email == Subscription.email?So aktualisieren Sie vorhandene geschachtelte Attribute w/no FK

Hinweis, dass die bestehenden Abonnements könnte user_id = nil

Antwort

1

Wahrscheinlich haben, was Sie tun möchten, ist die E-Mail als Fremdschlüssel verwenden:

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

Hrm, ja ... ich dachte darüber nach. Lass mich mit dieser Idee herumspielen. Vielen Dank. –

+0

Ich habe es gelegentlich getan. Funktioniert ziemlich gut neben einem natürlichen Schlüssel, was bedeutet, dass Sie Probleme bekommen, wenn Benutzer ihre E-Mail-Adressen ändern möchten. stellen Sie nur sicher, dass Sie einen Index für die E-Mail für beide Tabellen haben. – karmajunkie

+0

Ok, ich habe die Assoziationen eingerichtet, aber ich bekomme immer noch doppelte Datensätze. Ich habe update_only => true für accept_nested_attributes_for. Irgendwelche Ideen? –

0

ich mir vorstellen würde, dass diese aufgeteilt werden müssten in ein zweistufiger Prozess:

  1. Suchen Sie den Benutzer, den Sie aktualisieren möchten.
  2. Suchen Sie ein Abonnement (falls vorhanden) mit der E-Mail-Adresse des Benutzers, legen Sie das Abonnement für den Benutzer auf diesen Datensatz fest.
  3. Aktualisieren Sie den Benutzer wie üblich. Da die Verknüpfung jetzt vorhanden ist (d. H. User_subscription ist nicht null), werden die Abonnementdatensätze korrekt aktualisiert.
Verwandte Themen