2009-05-20 8 views
6

Ich habe eine has_many Beziehung zwischen zwei Entitäten, Feeds und Posts. Ich habe auch bestimmte Arten von Posts, Videos und Fotos. Dies ist in der Datenbank unter Verwendung der Vererbung einzelner Tabellen strukturiert.has_many und Single Table Vererbung

Im Moment habe ich mein Feed-Modell haben eine has_many Beziehung zwischen Feeds Angabe und Post (einschließlich der Subtypen)

class Feed < ActiveRecord::Base 
    has_many :posts 
    has_many :photos 
    has_many :videos 

Gibt es eine bessere, herkömmliche Art und Weise, dies zu spezifizieren? Oder ist das was ich habe so einfach wie es geht?

Antwort

4

Wenn ich Sie richtig verstehe, haben Sie Beiträge und Beiträge können entweder Video oder Foto sein. wie Jaryl sagte, was Sie haben, ist wahrscheinlich am leichtesten zu verstehen/zu handhaben, aber wenn Sie Lust auf Fantasie haben wollten, könnten Sie Single-Table-Vererbung oder polymophische Assoziationen verwenden.

STI - Beispiel (von Agile Web Development mit Rails 3rd Edition)

create_table :people, :force => true do |t| 
    t.string :type 

    #common attributes 
    t.string :name 
    t.string :email 

    #attributes for type=Customer 
    t.decimal :balance, :precision => 10, :scale => 2 

    #attributes for type=Employee 
    t.integer :reports_to 
    t.integer :dept 

    #attributes for type=Manager 
    #none 
end 

class Person < ActiveRecord::Base 
end 

class Customer < Person 
end 

class Employee < Person 
    belongs_to :boss, :class_name => "Manager", :foreign_key => :reports_to 
end 

class Manager < Person 
end 

Wenn Sie also ein Kunde

Customer.create(:name => 'John Doe', :email => '[email protected]', :balance => 78.29) 

Sie es per Person finden können dann erstellen

x = Person.find_by_name('John Doe') 
x.class #=> Customer 
x.email #=> [email protected] 
x.balance #=> 78.29 
x.some_customer_class_method # will work because the Person.find method returned a Customer object 

So könnten Sie

haben
class Post < ActiveRecord::Base 
end 
class Photo < Post 
end 
class Video < Post 
end 

und dann könnte man sie alle mit Post.All finden, aber Sie würden Photo und Video-Objekte zurück (und Post-Objekte, wenn Sie Beiträge, die nicht Foto oder Video)

nicht zu vergessen die string: Geben Sie Ihre db-Tabelle ein

+1

http://stackoverflow.com/questions/3231889/rails-sti-with-inheriting-children Ich versuche herauszufinden, wie die STI ein Kind-Objekt, also mit dem gegebenen Beispiel, wie würde ich Code " Person gehört zu: Firma "und" Firma hat viele: Personen "? – Rabbott

1

Dies ist so einfach wie möglich.

Nun, wenn Fotos genauso wie Videos behandelt werden könnten, könnten Sie vielleicht STI beseitigen und mit Hilfe von benannten Bereichen Accessoren für verschiedene Arten von Inhalten bereitstellen.

0

Ich stimme zu, dass das Beispiel in der Frage so einfach wie möglich ist. Es benutzt bereits STI und gibt die Assoziationen eindeutig an.

Auch könnten Sie die STI später ausreißen und: Fotos und: Videos in ihre eigenen separaten Tabellen aufteilen, ohne den Code des Feed-Modells um ein Bit zu ändern. Ergebnis!