2009-05-20 9 views
6

J'ai une relation has_many entre deux entités, Feeds et Posts. J'ai aussi des types spécifiques de messages, vidéos et photos. Ceci est structuré dans la base de données en utilisant l'héritage de table unique.has_many et l'héritage de table unique

En ce moment j'ai mon modèle d'alimentation spécifiant une relation has_many entre les tétées et les messages (y compris les sous-types)

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

Y at-il une meilleure façon plus conventionnelle de le préciser? Ou est ce que j'ai aussi simple que possible?

Répondre

4

Si je vous comprends bien, vous avez des messages et des messages peuvent être vidéo ou photo. Comme Jaryl a dit que ce que vous avez est probablement le plus facile à comprendre/gérer, cependant, si vous voulez vous faire plaisir, vous pouvez utiliser l'héritage de table unique ou des associations polymorphes.

STI - par exemple (de développement Agile Web avec 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 

Donc, si vous créez un client

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

vous pouvez le trouver par personne

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 

Donc, vous pourriez avoir

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

et vous pouvez les trouver par Post.all mais vous retrouverais objets photo et vidéo (et des objets post si vous avez des postes qui ne sont pas photo ou vidéo)

ne pas oublier la string: tapez dans votre table db

+1

http://stackoverflow.com/questions/3231889/rails-sti-with-inheriting-children J'essaie de comprendre comment faire du STI un objet enfant, donc avec l'exemple donné comment je coderais " Person belongs_to: company "et" Company has_many: persons "? – Rabbott

1

C'est à peu près le plus simple que vous pouvez faire. Eh bien, si les photos pouvaient être traitées de la même manière que les vidéos, vous pourriez peut-être supprimer les STI et utiliser des portées nommées pour fournir des accesseurs à différents types de contenu.

0

Je suis d'accord que l'exemple de la question est aussi simple que possible. Il utilise déjà la STI et indique clairement les associations.

De même, vous pouvez extraire le code STI ultérieurement et scinder: les photos et les vidéos dans leurs propres tables sans modifier le code du modèle de flux. But!

Questions connexes