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?

War es hilfreich?

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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top