我创建了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
如何设置主键?原因只是我已经填充了朋友db,但我总是可以重新填充它。你能建议如何将uid设置为主键吗? – 2013-02-26 01:09:33
我建议你改变你的模型如何工作,而不是改变rails默认值。这种方式更容易。使用id作为外键有什么问题? – jvnill 2013-02-26 01:25:08