STI - Single Table Vererbung ist, was Sie suchen. http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class-ActiveRecord::Base-label-Single+table+inheritance http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html
Sie Ihr Modell wie immer schaffen, sondern ein Attribut even_type
als String zur Datenbank hinzufügen. (Vorgabe ist "Typ") Sie lassen das EventModel wissen, dass dies die Vererbungsspalte ist.
class Event < ActiveRecord::Base
self.inheritance_column = :event_type
# dont forget your scopes to easy access them by type
# Event.party or Event.ultrafestival
scope :party, -> { where(event_type: 'Party') }
scope :ultrafestival, -> { where(event_type: 'UltraFestival') }
scope :tomorrowland, -> { where(event_type: 'TomorrowLand') }
def host
raise "needs to be implemented in your sub-class!"
end
end
Als Sie einige Unterklassen erstellen. Stellen Sie sicher, dass diejenigen erben aus Event
class Party < Event
end
class UltraFestival < Event
end
class Tomorrowland < Event
end
Grundsätzlich sind alle Objekte sind Events! Also, wenn Sie Event.all
gehen, werden Sie sie alle bekommen! Technisch kann ein Objekt etwas anderes sein. Alle diese "Ereignisse" werden in der gleichen Tabelle gespeichert, sie unterscheiden sich durch die event_type
, die in diesem Beispiel "party", "ultra_festival" oder "tomorrowland" sein wird. seit Jahren -
Jetzt können Sie einige spezielle Sachen zu jeder dieser Klassen können zum Beispiel
class Party < Event
def host
"private homeparty PTY"
end
def publish_photostream
end
def call_a_cleaning_woman
end
end
class UltraFestival < Event
attr_accessor :location
def host
"UMF Festival Corp."
end
def is_in_europe?
end
def is_in_asia?
end
end
class Tomorrowland < Event
def host
"ID&T"
end
def download_after_movie!
end
end
Dies ist die Standard-Rails Weise hinzuzufügen. Natürlich funktioniert es bei jedem Hoster und bei Postgres.
// bearbeiten: Wenn Ihre Unterereignisse einige spezielle Tabellen in der Datenbank benötigen, dann müssen Sie MTI, Multi-Table-Vererbung gehen.
vielleicht geben Sie mir feedbeck auf meine Antwort, um mich wissen zu lassen, wenn Sie weitere Hilfe benötigen –