2011-11-23 12 views
5

Estoy buscando agregar un modelo Favorite a mis modelos User y Link.Modelado Favoritos

lógica de negocios

  • los usuarios pueden tener múltiples enlaces (es decir, se pueden añadir varios enlaces)
  • Los usuarios pueden favoritos enlaces múltiples (de sus propios u otros usuarios)
  • Un Enlace puede ser preferido por varios usuarios, pero tiene un propietario

No estoy seguro de cómo modelar esta asociación y cómo sería un usuario favorito b e creado una vez que los modelos están en su lugar?

class User < ActiveRecord::Base 
    has_many :links 
    has_many :favorites 
end 

class Link < ActiveRecord::Base 
    belongs_to :user 
    #can be favorited by multiple users 
end 

class Favorite < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :link 
end 

Respuesta

8

¿Y el siguiente modelo de datos:

class User < ActiveRecord::Base 
    has_many :links 
    has_many :favorites, :dependent => :destroy 
    has_many :favorite_links, :through => :favorites, :source => :link 
end 

class Link < ActiveRecord::Base 
    belongs_to :user 
    has_many :favorites, :dependent => :destroy 
    has_many :favorited, :through => :favorites, :source => :user 
end 

class Favorite < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :link 
end 

Desde User ya tiene una asociación llamada links y Link ya tiene uno llamado users, no podemos usar el mismo nombre para la asociación has_many :through (por ejemplo, User has_many :links, :through => :favorites no funcionaría). Por lo tanto, inventamos un nuevo nombre de asociación y ayudamos a Rails a saber qué asociación cargar de la asociación intermediaria a través del atributo source.

aquí hay algo de pseudocódigo para el uso de esta asociación:

# Some users 
user1 = User.create :name => "User1" 
user2 = User.create :name => "User2" 

# They create some links 
link1_1 = user1.links.create :url => "http://link1_1" 
link1_2 = user1.links.create :url => "http://link1_2" 
link2_1 = user2.links.create :url => "http://link2_1" 
link2_2 = user2.links.create :url => "http://link2_2" 

# User1 favorites User2's first link 
user1.favorites.create :link => link2_1 
# User2 favorites both of User1's links 
user2.favorites.create :link => link1_1 
user2.favorites.create :link => link1_2 

user1.links   => [link1_1, link1_2] 
user1.favorite_links => [link2_1] 
user2.links   => [link2_1, link2_2] 
user2.favorite_links => [link1_1, link1_2] 
link1_1.favorited => [user2] 

link2_1.destroy 

user1.favorite_links => [] 
user2.links   => [link2_2] 
+0

¿Me necesita para crear '' modelos Favorite_Link' y Favorited'? – Dru

+0

No; el 'has_many: through' combinado con las opciones' class_name' indica que Rails debe buscar en la asociación dada para otra asociación, esencialmente saltando a través de dos modelos para obtener los objetos correctos. –

+0

DISCRETO [Explicado arriba]: Gracias, estoy teniendo problemas para entender cómo podemos hacer referencia a: favoritos y: enlaces favoritos en modelos sin los existentes como modelos. ¿Hay un nombre para esta técnica? Me gustaría leer sobre esto para entender cómo funciona. – Dru