has_many und einzelne Tabelle Vererbung
-
23-08-2019 - |
Frage
Ich habe eine has_many Beziehung zwischen zwei Entitäten, Feeds und Posts. Ich habe auch bestimmte Arten von Beiträgen, Videos und Fotos. Dies wird in der Datenbank strukturiert einzelne Tabelle Vererbung.
Im Moment habe ich mein Feed-Modell eine has_many Beziehung zwischen Feeds und Beiträge haben Angabe (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 so einfach haben, wie es bekommen kann?
Lösung
Wenn ich Sie richtig verstanden haben Sie Beiträge und Beiträge können entweder Video oder ein Foto sein. wie Jaryl gesagt, was Sie haben, ist wahrscheinlich die einfachste jedoch zu verstehen / handhaben, wenn Sie Lust bekommen wollten konnte man einzelne Tabelle Vererbung oder polymorphe 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 einen Kunden erstellen
Customer.create(:name => 'John Doe', :email => 'john@doe.com', :balance => 78.29)
Sie können es dann über Person finden
x = Person.find_by_name('John Doe')
x.class #=> Customer
x.email #=> john@doe.com
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 sind)
vergessen Sie nicht, die Zeichenfolge: Typ in Ihrer Tabelle db
Andere Tipps
Das ist so ziemlich das einfachste Sie tun können.
Nun, wenn Fotos die gleichen wie Videos behandelt werden könnten, dann könnten Sie vielleicht mit STI abschaffen und verwenden Scopes Accessoren auf verschiedene Arten von Inhalten zu schaffen.
Ich bin damit einverstanden, dass das Beispiel in der Frage ist so einfach wie es nur geht. Es ist bereits STI mit und eindeutig die Verbände.
Auch könnten Sie später die STI herausreißen und Split: Fotos und: Videos in ihre eigenen separaten Tabellen ohne das Feed-Modell Code ein Bit verändert wird. Score!