1

在我的应用程序中,我有 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
4

3 回答 3

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用于多态关联。有关更多信息,请参阅文档中的这一章。

于 2009-10-06T04:52:12.170 回答
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 我将其保留为 :likes,因为在这个应用程序中,他们将无法投反对票,只能投赞成票。

于 2009-10-06T05:21:52.160 回答
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

希望它有帮助=)

于 2009-10-06T04:58:41.190 回答