2008-09-16 4 views
2

Also arbeite ich an einer Rails-App, um das Gefühl für die ganze Sache zu bekommen. Ich habe ein Product Modell, das ein Standard-ActiveRecord-Modell ist. Ich möchte jedoch auch zusätzliche Produktinformationen von Amazon ECS erhalten. So erhält mein vollständiges Modell einige seiner Informationen aus der Datenbank und einige aus dem Web-Service. Meine Frage ist, sollte ich:Wie sollten Rails-Modelle mit Datenbank- und Nicht-Datenbank-Datenquellen aufgeteilt werden?

  1. Machen Sie zwei Modelle ein Produkt und ein ProductAWS und sie dann auf Controller-Ebene zusammenbinden.

  2. Hat das Product ActiveRecord-Modell ein ProductAWS-Objekt, das alle AWS-Daten enthält?

  3. Fügen Sie einfach alle AWS-Funktionen zu meinem Produktmodell hinzu.

  4. ???

Antwort

0

Wie bei den meisten Dingen: es kommt darauf an. Jede Ihrer Ideen hat einen Wert. Wenn es nach mir ginge, würde ich auf diese Weise beginnen:

class Product < ActiveRecord::Base 
    has_one :aws_item 
    end 
    class AWSItem 
    belongs_to :product 
    end 

Die wichtigsten Fragen, die Sie sich selbst fragen, sind:

Sind Sie nur AWS ECS Produkte gehen zu bieten, oder müssen Sie andere Produkte? Wenn Sie Produkte haben, die nichts mit Amazon zu tun haben, kümmern Sie sich nicht um ASIN usw., dann könnte ein has_one der richtige Weg sein. Oder, noch besser, eine polymorphe Beziehung zu einer: verkaufbaren Schnittstelle, so dass Sie später verschiedene Erweiterungstypen anschließen können.

Ist das Verhalten anders, oder sind die Daten auch anders? Weil Sie vielleicht prüfen wollen:

class Product < ActiveRecord::Base 
end 
class AWSItem < Product 
    def do_amazon_stuff 
    ... 
    end 
end 

Wie wollen Sie das System auszuführen, wenn Amazon ECS nicht verfügbar ist? Sollte es Ausnahmen auslösen? Oder sollten Sie sich auf eine lokal zwischengespeicherte Version des Katalogs verlassen?

class Product < ActiveRecord::Base 

end 

class ItemFetcher < BackgrounDRb::Rails 
    def do_work 
     # .... Make a cached copy of your ECS catalog here. 
     # Copy the Amazon stuff into your local model 
    end 
end 

Spaziergang durch diese Fragen langsam und die Antwort wird klarer werden. Wenn dies nicht der Fall ist, beginnen Sie mit dem Prototyping. Viel Glück!

0

können Sie die in Active composed_of Beziehung verwenden. Sie erstellen eine reguläre Klasse mit allen Attributen, die Sie über AWS verwalten, und geben an, dass Ihre Produktklasse aus dieser Klasse besteht. ActiveRecord wird die Delegierung der zugeordneten Attribute zu und von dieser Klasse behandeln.

Siehe the documentation of composed_of

0

@Menno

Was ActiveResource für die AWS-Attribute-Klasse?

+0

Nein, ich habe bereits eine Client-Bibliothek. – bhollis

0

Wenn Sie Daten aus zwei völlig verschiedenen Quellen abrufen (ActiveRecord einerseits und das Internet andererseits), bietet es viele Vorteile, diese als separate Modelle zu speichern. Wie oben beschrieben, hat Produkt has_one (oder has_many): aws_item.

Verwandte Themen