¿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]
¿Me necesita para crear '' modelos Favorite_Link' y Favorited'? – Dru
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. –
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