我创建了两个模型:用户和朋友。用户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
答案 0 :(得分:0)
您的设置有问题。这句话
has_many :friends, :foreign_key => "uid"
在用户模型中,将friends.uid
与user.id
匹配。 friends.uid
是与用户的主键匹配的外来词,即id列。这也是一样,
belongs_to :user, :foreign_key => "uid"
如果您希望这项工作正常,则需要将用户的主键设置为uid
。你有什么理由想这么做吗?
答案 1 :(得分:0)
对于遇到此问题的任何人。解决方案是在用户模型中设置primary_key ='uid',并在友元模型中设置:foreign_key =&gt;'uid'