2

我正在爲一個客戶建立一個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返回一個數組只包含用戶;如果它們不是,它會返回一個空數組。

有沒有人有任何建議?

+1

還有一個類似的問題在http://stackoverflow.com/questions/5773523/is-there-a-gem-to-create-twitter-like-follow-or-is-that-a-trivial-has-許多參考了這個模式的教程和寶石。可能想檢查出來。 – MrTheWalrus

+0

你爲什麼不試試? – Lichtamberg

+0

@Lichtamberg:我嘗試了幾種不同的方法。然而,我真正喜歡的是不僅要知道正確的答案,還要理解*爲什麼*通過改進對不同關鍵字的理解,這是正確的答案。 –

回答

0

它看起來這是正確的格式:

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 => :followed, :source => :follower, :uniq => true 

對於Rails的新手,在:uniq => true是很重要的(因爲我發現,而這樣做),因爲它使has_many X, :through => Y關係從返回副本(也就是,如果沒有它,你可能會得到多個不同的對象,每個對象都有自己的對象ID,全部引用相同的記錄/行)。

相關問題