0

我创建了 2 个模型:用户和朋友。用户有_许多朋友和朋友属于_to 用户。

在这两个模型中,我手动将 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。我假设它与 session[: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"

请注意,在登录时在我的会话控制器中,我使用 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
4

2 回答 2

0

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

于 2013-03-03T17:57:02.313 回答
0

你的设置有问题。这个说法

has_many :friends, :foreign_key => "uid"

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

belongs_to :user, :foreign_key => "uid"

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

于 2013-02-25T23:46:50.630 回答