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
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top