我正在爲一個客戶建立一個Rails項目,他們希望用戶(一個模型)能夠相互關注(如在Twitter中)。他們還希望能夠跟蹤一個用戶何時開始跟蹤另一個用戶。如何使用:through?設置定向多對多自聯接?
因爲我需要跟蹤創建日期,所以我認爲has_many X, :through => Y
關係是要走的路,因此Y會跟蹤它創建的日期。
我有我的跟蹤模型建立:
class Follow < ActiveRecord::Base
attr_accessible :actor_id, :observer_id, :follower, :followee
attr_readonly :actor_id, :observer_id, :follower, :followee
belongs_to :follower, :class_name => 'User', :foreign_key => :observer_id
belongs_to :followee, :class_name => 'User', :foreign_key => :actor_id
validates_presence_of :follower, :followee
validates_uniqueness_of :actor_id, :scope => :observer_id
end
的問題是我怎麼設置的用戶模型中的關係?
理想我想它具備以下條件:
:follows
將相關的跟隨對象,其中自是跟隨者(observer_id):followed
將相關的跟隨對象,其中自是關注者(actor_id):following
將是相關聯的用戶對象,其中自爲從動件(observer_id):followers
將是相關聯的用戶對象(actor_id)
雖然我不確定如何編寫has_many :through
部件?我應該使用:source => X
還是foreign_key => X
?我應該把哪個鍵(actor_id或者observer_id)放在每個鍵中?
編輯:目前,我正在做這個
has_many :follows, :foreign_key => :observer_id
has_many :followed, :class_name => 'Follow', :foreign_key => :actor_id
has_many :following, :class_name => 'User', :through => :follows, :source => :followee, :uniq => true
has_many :followers, :class_name => 'User', :through => :follows, :source => :follower, :uniq => true
,它的主要工作。除:followers
之外的所有人都能正常工作,但user.followers
正在做一些奇怪的事情。它似乎像它檢查用戶是否正在跟蹤某人,如果他們然後user.followers
返回一個數組只包含用戶;如果它們不是,它會返回一個空數組。
有沒有人有任何建議?
還有一個類似的問題在http://stackoverflow.com/questions/5773523/is-there-a-gem-to-create-twitter-like-follow-or-is-that-a-trivial-has-許多參考了這個模式的教程和寶石。可能想檢查出來。 – MrTheWalrus
你爲什麼不試試? – Lichtamberg
@Lichtamberg:我嘗試了幾種不同的方法。然而,我真正喜歡的是不僅要知道正確的答案,還要理解*爲什麼*通過改進對不同關鍵字的理解,這是正確的答案。 –