Comment définir les relations entre les deux modèles ActiveRecord qui se rapportent à l'autre de deux façons différentes?
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
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