1

Dans mon application, j'ai les classes Utilisateur, Vidéo et Vote. Les utilisateurs et les vidéos peuvent interagir de deux manières différentes: en tant que «un-à-plusieurs» ou «plusieurs-à-plusieurs». Le premier est lorsqu'un utilisateur soumet une vidéo (un utilisateur peut soumettre de nombreuses vidéos). Ce dernier est lorsqu'un utilisateur vote sur une vidéo (les utilisateurs ont de nombreuses vidéos à travers les votes, et vice versa). Voici mon code, qui ne fonctionne pas (je pense - je peux faire quelque chose de mal dans la vue). S'il vous plaît aidez-moi à comprendre la bonne façon de structurer ces associations:Comment définir les relations ActiveRecord entre deux modèles liés les uns aux autres de deux manières différentes?

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 
+0

Pourriez-vous développer ce qui ne fonctionne pas? Y a-t-il une erreur, etc? –

+0

quand j'essaye de faire: video.voters << utilisateur, il est dit "Undefined method 'votes" pour #

Répondre

1
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 

Plus de détails peuvent être trouvés ici: http://guides.rubyonrails.org/association_basics.html

Hope it helps =)

2

Je ne suis pas allé et vérifié, mais il ressemble à ceci:

Au lieu de

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

utilisation

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

Idem avec le bas:

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

devient

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

:as est utilisé pour les associations polymorphes. Voir this chapter in docs pour plus d'informations.

+0

Ceci me met dans la bonne direction, la seule chose qui manque est que vous devez aussi ajouter: source =>: user &: source =>: video Puis je l'ai essayé sans la partie: class_name et ça fonctionnait encore avec juste: source.Merci, je l'avais upvote mais je n'ai pas assez de rep –

1

Merci pour votre aide les gars, m'a fait certainement 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 l'ai gardé comme: aime parce que, dans cette application, ils ne seront pas en mesure de downvote, ne upvote.

Questions connexes