2009-05-20 18 views
6

Tengo una relación has_many entre dos entidades, Fuentes y Publicaciones. También tengo tipos específicos de publicaciones, videos y fotos. Esto está estructurado en la base de datos utilizando herencia de tabla única.has_many and single table inheritance

Ahora mismo tengo mi modelo de alimentación que especifica una relación entre has_many Feeds y mensajes (incluyendo los subtipos)

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

¿Hay una mejor manera, más convencional para especificar esto? ¿O es lo que tengo tan simple como puede obtener?

Respuesta

4

Si te entiendo correctamente, tienes Publicaciones y las publicaciones pueden ser de video o foto. como dijo Jaryl, lo que tienes es probablemente el más fácil de entender/manejar; sin embargo, si quieres ser elegante, puedes usar una sola tabla de herencia o asociaciones polimórficas.

STI - ejemplo (de desarrollo web ágil con rieles 3ª edición)

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 

lo tanto, si se crea un cliente

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

a continuación, puede encontrarlo a través 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 

Entonces podría tener

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

y entonces se podría encontrar a todos ellos por Post.All pero se podrían obtener de vuelta de fotografía y vídeo (objetos y objetos postales si tiene mensajes que no son foto o vídeo)

no se olvide el cadena: escriba en su tabla db

+1

http://stackoverflow.com/questions/3231889/rails-sti-with-inheriting-children Estoy tratando de averiguar cómo tener el objeto de ITS un niño, por lo que con el ejemplo dado, ¿cómo voy a codificar " La persona pertenece a: compañía "y" Compañía tiene_muy: personas "? – Rabbott

1

Esto es más o menos lo más simple que puede hacer.

Bueno, si las fotos se pueden tratar igual que los videos, entonces quizás se pueda eliminar el STI y usar ámbitos con nombre para proporcionar acceso a diferentes tipos de contenido.

0

Acepto que el ejemplo en la pregunta es tan simple como se pone. Ya está usando STI y establece claramente las asociaciones.

Además, podría romper el STI más adelante y dividir: fotos y videos en sus propias tablas separadas sin cambiar el código del modelo de Feed un bit. ¡Puntuación!