2014-06-17 6 views
7

Ich habe die grundlegende events Tabelle, und möchte für jeden Ereignistyp Untertabellen haben (hiking, party, riverrun, etc).Von STI, MTI oder CTI, was ist die derzeit vorgeschlagene Rails 4-Lösung?

Ich sehe viele alte (2011/2012) Beiträge zu CTI, MTI und STI. Einige Lösungen funktionierten für Heroku, andere nicht.

Was ist die "aktuelle" Rails Art, diese Art von Sache zu tun? Wurde dies zu Rails 4.x hinzugefügt? Gibt es einen magischen Edelstein, der dies bewältigt (mit Postgres auf Heroku)?

Einige Informationen, wenn es hilft:

In Zukunft wird es zwischen 20-50 Ereignisse sein, und jede Untertabelle könnte so viele wie 80 Spalten sein. Die Seite wird auf Heroku gehostet. Running Rails 4.0.2

+0

vielleicht geben Sie mir feedbeck auf meine Antwort, um mich wissen zu lassen, wenn Sie weitere Hilfe benötigen –

Antwort

0

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.