2009-05-28 13 views
1

Ich habe ein typisches Benutzermodell (Benutzername, Passwort, Name, etc). Ich möchte Benutzern erlauben, drei ausgewählte Kategorien an ihr Konto anzuhängen. Jede der drei Kategorien existiert im Kategoriemodell.Mehrere Fremdschlüssel in einem einzigen Rails-Modell referenziert

Wie kann ich drei Fremdschlüssel aus der Kategorie mit einem einzelnen Benutzer verknüpfen, ohne eine Zwischentabelle zum Nachverfolgen zu verwenden? Jede Kategorie kann zu einer beliebigen Anzahl von Benutzern gehören, aber jeder Benutzer kann nur drei Kategorien haben.

Ich spielte mit has_many: durch, aber ich glaube wirklich nicht, dass eine Beziehungstabelle notwendig ist, und es würde Los des Codierens auf meinem Ende erzeugen, um damit zu arbeiten.

Irgendwelche Ideen?

Antwort

2

Aus der Sicht der Codemanagementfähigkeit möchten Sie die Anzahl der Kategorien, die ein Benutzer derzeit auswählen kann, auf 3 beschränken, aber Sie möchten ihn möglicherweise nicht mit dieser Einschränkung codieren. Du triffst dich später selbst, wenn du es auf 5 erhöhen oder auf 1 reduzieren willst. Mein Vorschlag wäre, einfach has_and_belongs_to_many mit einer Join-Tabelle zu verwenden (du brauchst nicht , denn was ich sagen kann, weißt du nicht 't brauchen eine Verbindung Modell, nur eine Join-Tabelle). Wenn Sie HABTM verwenden, wird automatisch eine Join-Tabelle verwendet, sodass Sie sich keine Gedanken darüber machen müssen, den Code zu schreiben, um damit umzugehen. Stellen Sie sicher, dass Sie die Join-Tabelle und ihre Spalten richtig benennen.

Um den Benutzer tatsächlich auf nur 3 Kategorien zu beschränken, implementieren Sie einfach diese Einschränkung in der Ansicht/Controller (d. H. Die Benutzeroberfläche einschränken, so dass sie nicht mehr als 3 wählen können).

Ich bin sicher, du hast das schon gelesen, aber falls du es nicht hast, hier ist die docs für HABTM.

+0

Gefolgt von Ihrem Rat und es funktionierte sehr gut und sehr sauber. Vielen Dank! Ich denke, das Kernproblem war mein Verständnis von has_and_belongs_to_many und der Join-Tabelle. – Retro486

+0

HABTM hat mich zuerst erschreckt, weil es so übermäßig kompliziert scheint. Aber wenn man sich einmal daran gewöhnt hat und wofür es gut ist, wird klar, wie man seine Macht richtig einsetzt. Froh, dass ich helfen konnte. Ians Idee für eine Validierung auf Modellebene ist ebenfalls gut zu befolgen. –

2

HABTM ist Ihre beste Wette. So beschränkt Anwender auf drei Kategorien, fügen Sie eine Modellebene Validierung:

class User < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
    validate :no_more_than_three_categories 
protected 
    def no_more_than_three_categories 
    self.errors.add(:categories, "may not have more than three") if categories.size > 3 
    end 
end 

Nach Wahl, ziehen Sie die magische Zahl 3 auf eine Klassenstufe konstant oder eine Konfigurationseinstellung.

Und keine Angst vor dem Code. Mach es richtig und der Code wird dich fürchten.

+0

Danke für das Bonusmaterial, um die Validierung im Modell zu behalten (was ich sehr bevorzuge). Ich werde immer noch (und werde immer) lernen. – Retro486

Verwandte Themen