2011-04-10 63 views
20

我目前正在研究一個小型社交網絡應用程序,現在我正在嘗試創建一個代表友誼的模型之間的用戶。這是我想出了迄今:如何在社交應用程序的Rails 3中實現友誼模型?

class User < ActiveRecord::Base 

    # ... 
    has_many :friendships 
    has_many :friends, :through => :friendships 

end 

class Friendship < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :friend, :class_name => 'User' 
end 

友誼模型已經確認因爲我想用 定義友誼未決或證實其布爾場

如何訪問某個用戶的所有待處理請求?我可以以某種方式定義 這使用Rails的範圍方法嗎?像

current_user.friendships.requests # => [Friendship, Friendship, ...] 

會很好。

如何使此關聯雙向?我簡單地添加其他 友誼一旦一個已經確認朋友的要求,使得我的友誼 表將類似於此:

| user_id | friend_id | confirmed | 
----------------------------------- 
| 1  | 2   | true  | 
| 2  | 1   | true  | 
+1

除了友情鏈接之外,朋友與其他用戶有什麼不同? – 2011-04-10 17:06:10

回答

30

要訪問所有懸而未決的友誼,你可以使用關聯:

has_many :pending_friends, 
     :through => :friendships, 
     :source => :friend, 
     :conditions => "confirmed = 0" # assuming 0 means 'pending' 

爲了使友誼是雙向的,你可能想用一個字符串狀態列有一個取代你的布爾證實列以下三個值:「待處理」,「請求」和「接受」(可選「拒絕」)。這將有助於追蹤誰提出了友誼請求。

當友誼請求被髮送時(例如從Foo到Bar),您創建兩個友誼記錄(封裝在一個事務中):一個請求和一個待處理以反映響應。那個酒吧有一個來自Foo和Foo的要求的友誼,他和Bar有一個待定的友誼。

def self.request(user, friend) 
    unless user == friend or Friendship.exists?(user, friend) 
     transaction do 
     create(:user => user, :friend => friend, :status => 'pending') 
     create(:user => friend, :friend => user, :status => 'requested') 
     end 
    end 
    end 

當友誼被接受時(例如通過酒吧),兩個友誼記錄被設置爲接受。

def self.accept(user, friend) 
    transaction do 
     accepted_at = Time.now 
     accept_one_side(user, friend, accepted_at) 
     accept_one_side(friend, user, accepted_at) 
    end 
    end 

    def self.accept_one_side(user, friend, accepted_at) 
    request = find_by_user_id_and_friend_id(user, friend) 
    request.status = 'accepted' 
    request.accepted_at = accepted_at 
    request.save! 
    end 

這主要是覆蓋在Railspace書邁克爾·哈特爾和奧勒留普羅恰茲卡的第14章。以下是source code,它應該可以幫助您優化您的解決方案。

+0

只是要說謝謝,你已經幫助我解決了同樣的問題,但在PHP中。 =)+1 – JCM 2011-08-25 18:25:24

+0

你知道友誼模型中哪些屬性應該可以訪問嗎?我假設只有狀態屬性應該可以訪問。我對麼? – pratski 2013-03-26 11:46:49

+0

hi @mbreining今天我遇到了你的解決方案,我不知道是否有比這更強大的解決方案,但我認爲在Friendships表中爲2個用戶之間的關係創建兩條線並不是一個好主意,我發佈一個新的問題,如果你可以幫助http://stackoverflow.com/questions/19339596/the-best-way-to-implement-a-friendship-model-in-rails謝謝你 – medBo 2013-10-12 22:08:06

1

我建議你這本書RailsS​​pace:建立一個社交網站。它清楚地解釋瞭如何實現友誼模式。雖然它不能擴展到其他形式的關係,但適用於您的問題。

+0

你知道哪些屬性應該可以通過友誼模式訪問嗎?我假設只有狀態屬性應該可以訪問。我對麼? – pratski 2013-03-26 13:35:53

4

簡短的回答是肯定的。只需創建另一個友誼記錄即可表示雙向關聯。

我爲這類問題寫了一個名爲has_friendship的寶石。所有你需要做的就是在你的模型中放入has_friendship,並且所有的關聯和方法都將被照顧。

希望這會有所幫助!

相關問題