2013-03-26 70 views
0

我有一個Users list,在這裏我需要把follow/unfollow按鈕,每個用戶在我參與的簽名。用戶列出與後續/取消關注按鈕

會有一些其他地方,我想使用相同的方法關注主題/組等。所以我認爲最好是寫一個關聯以避免每次需要這些按鈕時進行額外的查詢。

user_followings表結構

| id | user_id | recipient_id | 
| 1 | 1  | 2   | 
| 2 | 3  | 2   | 
| 3 | 10  | 3   | 

所以這裏使用id = 1用戶按照用戶=> 2 ...

所以bassicaly有has_many關聯類型,因爲用戶是繼許多其他用戶。但是我想出了一個想法,即添加has_one關聯類型,在那裏我將提供一個附加條件recipient_id=current_user.id,這樣只剩下一條記錄,並顯示以下狀態。

如果我成功使這個association,將有超級容易通過user.following.nil?鑑於檢查以下狀態,沒有額外的查詢,緩存等

我在CakePHP的應用程序,一旦之前作出這樣,SQL查詢看起來像:

ON (`UserFollowing`.`recipient_id` = `User`.`id` AND `UserFollowing`.`user_id` = 1) 

但CakePHP的允許綁定在飛行的關係,所以我加了current_user.id直接從會話的關聯情況。

我不能在Rails的做到這一點,因爲我不能把current_user.id模型來描述條件:

user.rb 
has_one :following, :class_name => 'UserFollowing', :conditions => {:user_id => current_user.id} 

方法鈮。 2

也許我可以使用:through來解決這個問題,但是我找不到任何例子來從我從中進行關聯的同一個users表中獲得結果。

方法Nb。 3

使用範圍Rails 3 devise, current_user is not accessible in a Model ?

不知道,哪種方式是最好的...

+0

嘗試':條件=> {:recipient_id => CURRENT_USER .id}' – HungryCoder 2013-03-26 10:12:57

+0

對不起,我用current_user.id拼寫錯了。我需要爲recipient_id提供收到的user.id。這不起作用:conditions => {:recipient_id => user.id} – Gediminas 2013-03-26 10:15:13

+0

我認爲你想要「用戶。ID「,但老實說,我不明白什麼是問題 – riffraff 2013-03-26 11:17:19

回答

0

雖然它不是直接回答你的問題:考慮到創業板:acts_as_follower。我將它用於類似的情況,它似乎符合您的需求。這有可能讓任何跟隨別的 - 檢查出來...

0

請閱讀第11章爲這個問題專門做吧。閱讀關於構建一個類似於應用程序的推特的全書。

Ruby On Rails Tutorial

+0

有比我更好的表邏輯,但仍然沒有好方法在用戶列表中爲每個用戶回顯關注/取消關注按鈕教程建議使用模型方法來檢查按鈕狀態因此每個用戶頁面會有+30個查詢...... :( – Gediminas 2013-03-26 17:55:20

0

嗯,我已經發現了與範圍來做到這一點的方式:

# user.rb 
    scope :with_relations, lambda { |current_user_id| 
    has_one :user_following, :foreign_key => 'recipient_id', :conditions => {:user_id => current_user_id} 
    where(:status => 1) 
    } 

    # users_controller.rb 
    @users = User.with_relations(current_user.id).limit(30).order('last_action desc')