2010-07-29 30 views
0

我正在研究Ruby on rails 2.3.8,並且我想構建一個功能來跟蹤用戶。關注用戶邏輯

爲此,我創建了2個表:用戶以下,用他們各自的模型:

class User < ActiveRecord::Base 
    has_and_belongs_to_many :followings, :foreign_key => "follower_id" 
end 

class Following < ActiveRecord::Base 
    has_and_belongs_to_many :users, :foreign_key => "follower_id", :class_name => "User" 
end 

現在,當我嘗試執行current_user.followings.all(憑有效CURRENT_USER的當然),它會拋出以下例外:

'followings_users' doesn't exist: SELECT 'followings'.* FROM `followings` INNER JOIN 'followings_users' ON 'followings'.id = 'followings_users'.following_id WHERE ('followings_users'.follower_id = 1) 

我無法完成此項工作。我不知道爲什麼它要求我提供「followings_users」表。如果我想稱之爲「跟隨」,該怎麼辦?

我在這裏做錯了什麼?

回答

1

使用habtm時,Rails將嘗試從連接表中獲取關聯。它嘗試通過連接兩個名稱(followings_users)來猜測表的名稱,或者您可以指定表的名稱作爲選項。但是你必須在你的遷移中明確地創建這個表。

查看文檔here

+0

因此,我最好的選擇是分別更改following_user和following_users的模型和表名稱? – 2010-07-29 17:53:38

+0

您只需添加':join_table'選項即可。當我們不使用傳統命名時,我們可以使用這個選項來指定連接表名。 – 2010-07-29 17:57:28

+0

我應該在哪個模型中添加該選項?它應該是:join_table =>'followings'?因爲我已經在User和Following模型上試過了,它向我投擲了以下內容,因爲它試圖「自己加入」:不是唯一的表/別名:'followings':SELECT'followings'。* FROM'followings' INNER JOIN 'followings' ON'followings'.id ='followings'.following_id WHERE('followings'.follower_id = 1) – 2010-07-29 18:01:45

1

你也可以做到這一點使用較新的語法has_many :through

class User < ActiveRecord::Base 
    has_many :user_followings 
    has_many :followings, :through => :user_followings 
end 

class UserFollowing < ActiveRecord::Base 
    belongs_to :users 
    belongs_to :followings 
end 

class Following < ActiveRecord::Base 
end 

這需要一個連接表稱爲:user_followings與列user_idfollowing_id

新語法通常比HABTM更受歡迎,因爲它允許您在連接模型上定義方法,儘管HABTM仍然可以正常工作,但它可能很有用。

+0

以下模型將具有哪些信息? – 2010-07-29 18:40:43

+0

您不需要在以下模型中定義關聯,除非您需要使用它們,也就是說,如果您想知道用戶關注以下內容,您可以定義'has_many:user_followings'和'has_many:users,:through => :user_followings'。我認爲你發佈的解決方案有類似之處。 – zetetic 2010-07-29 20:40:26