¿Cómo definir las relaciones entre los dos modelos ActiveRecord que se relacionan entre sí de dos formas diferentes?
Pregunta
En mi aplicación tengo el Usuario clases, vídeo y votar. Los usuarios y los videos pueden relacionarse entre sí de dos formas diferentes: como uno-a-muchos o como muchos-a-muchos. El primero es cuando un usuario envía un vídeo (un usuario puede enviar muchos videos). Este último es cuando un usuario se califican en un video (usuarios tienen muchos vídeos a través de votos, y viceversa). Aquí está mi código, que no funciona (creo - yo pueda estar haciendo algo mal en la vista). Por favor, me ayudan a entender la forma correcta de estructurar estas asociaciones:
class User < ActiveRecord::Base
has_many :videos, :as => :submissions
has_many :votes #have tried it without this
has_many :videos, :as => :likes, :through => :votes
end
class Vote < ActiveRecord::Base
belongs_to :video
belongs_to :user
end
class Video < ActiveRecord::Base
belongs_to :user
has_many :votes #have tried it without this . . . superfluous?
has_many :users, :as => :voters, :through => :votes
end
Solución
class User < ActiveRecord::Base
has_many :videos # Submitted videos
has_many :votes
has_many :voted_videos, :through => :votes # User may vote down a vid, so it's not right to call 'likes'
end
class Vote < ActiveRecord::Base
belongs_to :video
belongs_to :user
end
class Video < ActiveRecord::Base
belongs_to :user
has_many :votes
has_many :voters, :through => :votes
end
Más detalles se pueden encontrar aquí: http://guides.rubyonrails.org/association_basics.html
Espero que ayuda =)
Otros consejos
No he ido y comprobado, pero es algo como esto:
En lugar de
has_many :videos, :as => :likes, :through => :votes
Uso
has_many :likes, :class_name => "Video", :through => :votes
Lo mismo con la parte inferior:
has_many :users, :as => :voters, :through => :votes
se convierte
has_many :voters, :class_name => "User", :through => :votes
:as
se utiliza para asociaciones polimórficas. Ver este capítulo en documentos para obtener más información.
Gracias por su ayuda chicos, definitivamente me señaló en la dirección correcta. Aquí está el código de trabajo:
class User < ActiveRecord::Base
has_many :videos, :as => :submissions
has_many :votes
has_many :likes, :source => :video, :through => :votes
end
class Vote < ActiveRecord::Base
belongs_to :video
belongs_to :user
end
class Video < ActiveRecord::Base
belongs_to :user
has_many :votes
has_many :voters, :source => :user, :through => :votes
end
PS I guardó como:. Le gusta porque en esta aplicación no será capaz de downvote, solamente upvote