Comment définir les relations entre les deux modèles ActiveRecord qui se rapportent à l'autre de deux façons différentes?

StackOverflow https://stackoverflow.com/questions/1523541

Question

Dans mon application j'ai les classes utilisateur, vidéo, et vote. Les utilisateurs et les vidéos peuvent se rapporter les uns aux autres de deux manières différentes: comme un à plusieurs ou plusieurs à plusieurs. Le premier est lorsqu'un utilisateur soumet une vidéo (un utilisateur peut soumettre plusieurs vidéos). Ce dernier est quand un utilisateur vote sur une vidéo (les utilisateurs ont beaucoup de vidéos par votes, et vice-versa). Voici mon code, ce qui ne fonctionne pas (je pense - je faire quelque chose de mal dans la vue). S'il vous plaît aidez-moi à comprendre la bonne façon de structurer ces associations:

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
Était-ce utile?

La solution

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

Vous trouverez plus de détails ici: http://guides.rubyonrails.org/association_basics.html

it helps =)

Autres conseils

Je ne suis pas allé et vérifié, mais il va quelque chose comme ceci:

Au lieu de

has_many :videos, :as => :likes, :through => :votes

Utilisez

has_many :likes, :class_name => "Video", :through => :votes

Même avec le fond:

has_many :users, :as => :voters, :through => :votes

devient

has_many :voters, :class_name => "User", :through => :votes

:as est utilisé pour les associations polymorphes. Voir ce chapitre docs pour plus d'informations.

Merci pour votre aide les gars, m'a fait sans aucun doute dans la bonne direction. Voici le code de travail:

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 je continuais comme:. Aime parce que, dans cette application, ils ne seront pas en mesure de downvote, seulement upvote

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top