2013-02-25 68 views
0

我创建了2个模型:用户和朋友。用户has_many朋友和朋友belongs_to用户。手动关联模型,Rails无法理解来自第二个模型的数据。为什么?

在这两个模型中,我手动将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数据库中看到当前有一个用户,他的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 

回答

0

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

0

w有问题w ith你的设置。这在用户模式声明

has_many :friends, :foreign_key => "uid" 

,匹配friends.uiduser.idfriends.uid是与用户的主键(即id列)相匹配的外键。这也同样在这里,

belongs_to :user, :foreign_key => "uid" 

你需要,如果你想要这个工作设置的用户uid主键。你有什么理由要这样做?

+0

如何设置主键?原因只是我已经填充了朋友db,但我总是可以重新填充它。你能建议如何将uid设置为主键吗? – 2013-02-26 01:09:33

+0

我建议你改变你的模型如何工作,而不是改变rails默认值。这种方式更容易。使用id作为外键有什么问题? – jvnill 2013-02-26 01:25:08

相关问题