1

在我的應用程序中,我有類User,Video和Vote。用戶和視頻可以通過兩種不同的方式相互關聯:一對多或多對多。前者是用戶提交視頻時(一個用戶可以提交很多視頻)。後者是用戶在視頻上投票時(用戶通過投票有很多視頻,反之亦然)。這是我的代碼,它不起作用(我想 - 我可能在視圖中做錯了事)。請幫我理解正確的方法來組織這些協會:如何以兩種不同的方式定義兩個彼此相關的模型之間的ActiveRecord關係?

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

你能擴展什麼不行嗎?是否有錯誤等? – 2009-10-06 04:28:23

+0

當我嘗試做:video.voters <<用戶,它說:「未定義的方法'選民'爲#<視頻:0xb752b270> – 2009-10-06 04:43:49

回答

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

我還沒有和檢查,但它是這樣的:

而不是

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

+0

這使我在正確的方向。唯一缺少的是你還必須添加:源=>:user&:source =>:video。然後我在沒有:class_name部分的情況下嘗試了它,它仍然可以用:source。謝謝!我會upvote,但我沒有足夠的代表 – 2009-10-06 05:18:05

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,只是給予好評。

相關問題