2016-12-10 3 views
0

Ich habe eine Frage, wie Sie die Modelle in Rails bauen. Nehmen wir zum Beispiel das soziale Netzwerk Tumblr. Sie können dort auf verschiedene Arten posten. Links, nur Text, Fotos, Gespräche. Jetzt möchte ich etwas Ähnliches machen, aber ich bin mit der Modellierung meiner App auf Lager. Nehmen wir an, ich möchte ein Post Modell haben. So können meine Nutzer entweder nur einen Text oder einen mit einem Bild posten. Also ich denke, ich brauche auch ein Image Modell. Nehmen wir an, ich möchte, dass meine Benutzer ein Ereignis posten können, aber als eine Form eines Beitrags. Also ich denke, ich brauche ein Event Modell. Und so, vielleicht werde ich in Zukunft eine andere Idee für eine andere Art von Post haben (also sollte es immer auf die Post bezogen sein). Wie würden Sie die Modelle und Beziehungen so aufbauen, dass es leicht erweiterbar ist? Ich denke an etwas wie Enums von Java.Model Post mit verschiedenen Typen in Rails

Antwort

0

werde ich ein Modell Post für alle Arten der Post verwenden (Bild, Ereignis ...) Zum Beispiel posts Tabelle:

create_table :posts do |t| 
    t.belongs_to :author 
    t.column :post_type, :integer, default: 0 
    t.column :title, :string 
    t.column :body, :text 
    t.column :image_url, :string 
    t.column :star_at, :datetime 
    t.column :end_at, :datetime 
    t.timestamps 
end 

Modellspezifische Validierung für jeden Post-Typen hat:

class Post < ActiveRecord::Base 
    enum post_type: [ :event, :image, :message] 

    validates :image_url, presence: true, if: ->{ image? } 
    validates :start_at, :end_at, presence: true, if: ->{ event? } 
    validates :title, :body, presence: true, if: ->{ message? } 
end 

Gründe, diesen Weg zu wählen: alle

  • Einfach holen Daten aus der Datenbank. Keine Gewerkschaften, keine Mehrfachauswahl.
  • Einfaches Verwalten der Zwischenspeicherung, Regeln des Besitzers, ...
  • Verwenden Sie die Bedenken des Modells für jeden Post-Typ, um ein sauberes Modell zu haben.
+0

Okay, können Sie mir erklären, warum es besser sein sollte, nur ein Modell für alle Typen zu verwenden, anstatt mehrere Modelle zu verwenden? – Sylnois

+0

hinzugefügt Gründe für die Antwort –

Verwandte Themen