2010-07-29 57 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