如何以两种不同的方式定义两个相互关联的模型之间的ActiveRecord关系?

时间:2009-10-06 04:03:21

标签: ruby-on-rails ruby activerecord polymorphic-associations has-many-through

在我的应用程序中,我有类User,Video和Vote。用户和视频可以通过两种不同的方式相互关联:作为一对多或多对多。前者是用户提交视频(一个用户可以提交许多视频)。后者是用户对视频进行投票时(用户通过投票获得许多视频,反之亦然)。这是我的代码,它不起作用(我想 - 我可能在视图中做错了)。请帮助我理解构建这些关联的正确方法:

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

3 个答案:

答案 0 :(得分:2)

我没有去检查,但它是这样的:

而不是

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

使用

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

与底部相同:

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

变为

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

:as用于多态关联。有关详细信息,请参阅this chapter in docs

答案 1 :(得分: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

可在此处找到更多详细信息:http://guides.rubyonrails.org/association_basics.html

希望有帮助=)

答案 2 :(得分:1)

感谢您的帮助,无疑让我指出了正确的方向。这是工作代码:

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我把它保持为:喜欢因为在这个应用程序中他们不能进行downvote,只能upvote。