2017-12-25 3 views
1

Ich denke, es ist eher ein "Model Design" Problem als ein Schienenproblem.Schienen has_many STI mit Sub STI

Aus Gründen der Klarheit hier ist die Geschäftslogik: Ich habe Veranstaltungsorte und ich möchte mehrere APIs implementieren, um Daten über diese Veranstaltungsorte zu erhalten. All diese APIs haben viel gemeinsam, daher habe ich STI verwendet.

Dieser Teil funktioniert, jetzt, was ich versuche hinzuzufügen ist Fotos zum Veranstaltungsort. Ich werde diese Fotos von der API holen und mir wird klar, dass jede API anders sein könnte. Ich dachte über STI mit für das auch, und ich werde mit etwas wie das

# /app/models/api_photo.rb 
class ApiPhoto < ApplicationRecord 
    belongs_to :api 
end 

# /app/models/google_api_photo.rb 
class GoogleApiPhoto < ApiPhoto 
    def url 
    "www.google.com/#{reference}" 
    end 
end 

# /app/models/other_api_photo.rb 
class OtherApiPhoto < ApiPhoto 
    def url 
    self[url] || nil 
    end 
end 

Mein Ziel dieses < ApplicationRecord am Ende # /app/models/venue.rb Klasse Ort sein haben, am Ende has_one: google_api has_one: other_api has_many: apis has_many: Fotos: durch =>: apis Ende

# /app/views/venues/show.html.erb 
<%# ... %> 
@venue.photos.each do |photo| 
    photo.url 
end 
<%# ... %> 

Und photo.url gibt mir das Recht formattin g das ist abhängig von der api es ist.

Da ich tiefer in die Integration gehe, scheint etwas nicht richtig. Wenn ich Api die has_many :google_api_photo hätte, dann wird jede API GoogleApiPhoto haben. Was macht für mich keinen Sinn?

Irgendeine Idee, wie ich von hier fortfahren sollte?

Antwort

0

Ich denke, ich habe es gelöst.

diese

has_many :apis, :dependent => :destroy 
has_many :photos, :through => :apis, :source => :api_photos 

Durch den Aufruf venue.photos[0].url Anruf die richtige Klasse basierend auf dem type Feld des ApiPhoto

zu venue.rb Durch das Hinzufügen