手动关联的模型,Rails无法理解第二个模型的数据。为什么?

时间:2013-02-25 23:33:51

标签: ruby-on-rails

我创建了两个模型:用户和朋友。用户has_many朋友和朋友属于用户。

在两个模型中,我手动将foreign_key设置为= uid。因此我假设当我查找current_user.friends时,它应该列出所有拥有friend.uid = current_user.uid的朋友。然而,这种情况并非如此。

我认为这可能与我对current_user的定义有关。

我对current_user的定义在我的sessions_helper中为:

def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

注意会话[:user_id]。当我亲自登录时,我的user_id为1.

我注意到当我在主视图中拉<%= current_user.friends>时,它返回一个空白数组,这是奇怪的,因为我可以在SQLite数据库中看到当前有1个用户,其uid是12345并且有在朋友模型中超过100个条目,其uid也是= 12345.因此,我期待超过100个朋友的数组。查看我的服务器日志,显示:

SELECT "users".* FROM "users" WHERE "users"."id" =? LIMIT 1 <-[0m [['id',1]] SELECT "friends".* FROM "friends" WHERE "friends"."uid" =1 LIMIT 30 offset 0

这很重要,因为请注意它正在寻找friends.uid = 1。我假设它与会话[:user_id]相关联但我无法理解为什么它不会查找current_user.uid尽管我在两个表中专门将uid与foreign_key相关联。

我做错了什么?

用户模型:

class User < ActiveRecord::Base
   attr_accessible :name, :provider, :uid
   has_many :friends, :foreign_key => "uid"

朋友模特

class Friend < ActiveRecord::Base
   attr_accessible :friendid, :name, :uid
   belongs_to :user, :foreign_key => "uid"

请注意,在Loginin的会话控制器中,我使用OMNIAUTH并设置session[:user_id] = user.id如果相关: Sessions_controller:

def create
    auth = request.env["omniauth.auth"] 
    user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth)
    session[:user_id] = user.id
    redirect_to root_url, :notice =>"Signed in!"
end

2 个答案:

答案 0 :(得分:0)

您的设置有问题。这句话

has_many :friends, :foreign_key => "uid"

在用户模型中,将friends.uiduser.id匹配。 friends.uid是与用户的主键匹配的外来词,即id列。这也是一样,

belongs_to :user, :foreign_key => "uid"

如果您希望这项工作正常,则需要将用户的主键设置为uid。你有什么理由想这么做吗?

答案 1 :(得分:0)

对于遇到此问题的任何人。解决方案是在用户模型中设置primary_key ='uid',并在友元模型中设置:foreign_key =&gt;'uid'