2009-05-20 16 views
6

Ho una relazione has_many tra due entità, Feed e Post. Ho anche tipi specifici di post, video e foto. Questo è strutturato nel database utilizzando l'ereditarietà di una singola tabella.has_many e ereditarietà di una tabella singola

In questo momento ho il mio modello di alimentazione che specifica una relazione tra il has_many RSS e Messaggi (compresi i sottotipi)

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

C'è un modo migliore e più convenzionale per specificare questo? O è quello che ho il più semplice che può ottenere?

risposta

4

Se ho capito bene hai post e messaggi possono essere video o foto. come Jaryl ha detto che quello che hai è probabilmente il più facile da capire/gestire, tuttavia se volessi avere fantasia potresti usare l'ereditarietà di una singola tabella o associazioni polimorfiche.

STI - Esempio (da Agile Web Development con 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 

Quindi, se si crea un cliente

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

si può quindi trovare tramite persona

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 

Quindi potresti avere

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

e poi li potrebbe trovare da POST.All ma si sarebbe tornare Foto e Video oggetti (e oggetti postali se si dispone di messaggi che non sono foto o video)

non dimenticare le stringa: digitare nella tabella db

+1

http://stackoverflow.com/questions/3231889/rails-sti-with-inheriting-children Sto cercando di capire come avere lo STI come oggetto figlio, quindi con l'esempio fornito come faccio a codificare " La persona appartiene a: società "e" La società ha_molte persone "? – Rabbott

1

Questo è praticamente il più semplice che puoi fare.

Bene, se le foto possono essere trattate come i video, allora forse si può eliminare STI e utilizzare gli ambiti nominati per fornire accessor a diversi tipi di contenuto.

0

Sono d'accordo che l'esempio nella domanda è semplice come si ottiene. Sta già usando STI e afferma chiaramente le associazioni.

Inoltre, è possibile rimuovere STI in un secondo momento e dividere: foto e: video nelle proprie tabelle separate senza modificare il codice del modello Feed un bit. Punto!

Problemi correlati