2013-05-15 47 views
0

我嘗試實現一個簡單的應用程序,我擁有用戶,並從社交網絡獲取用戶友誼。我有兩個型號,下面列:Ruby on rails:與非ID鍵上的多列相關聯

User

  • id(默認ID)
  • sn_id(從社交網絡中的用戶ID)

FriendsRelation

  • user1_sn_id(外鍵User.sn_id
  • user2_sn_id(外鍵User.sn_id

如何實現關聯?

現在我寫上的用戶:

has_many :friends1, :class_name =>"FriendsRelation", :foreign_key =>"user1_sn_id" 
has_many :friends2, :class_name =>"FriendsRelation", :foreign_key =>"user2_sn_id" 

的問題是,如果我想獲得一個用戶的所有朋友,我不得不使用u.friends1u.friends2但我如何擺脫dissymetry的?

我應該把什麼協會放在FriendsRelation上?

此外,FriendsRelation表中的用戶ID是來自社交網絡的用戶ID,因爲它對我來說更容易。這是個問題嗎?我應該把用戶ID呢?

回答

1

使用你自己的id而不是主鍵是沒有問題的。只有確保沒有重複,並且還要爲該列添加索引。

關於dissimetry你有多個解決方案:

  • 合併基於兩個ID例如兩個列表def friends; friends1 + friends2; end
  • 添加雙記錄(雙向)的朋友表
  • 指定自定義作用域的關係,以反映從視點右鍵

所有各有利弊關係,但都是有效解決方案AFAIK。

+0

好吧,但如何指定關係,以便它使用sn_id而不是od?我不能這樣做:'has_many:friends1,:class_name =>「FriendsRelation」,:foreign_key =>「user1_sn_id」,:key =>「sn_id」' –

+0

使用':association_foreign_key =>「sn_id」 – Matzi