0

ユーザーと友達の2つのモデルを作成しました。ユーザーhas_manyfriendsおよびfriendbelong_toUsers。

どちらのモデルでも、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で、friendsモデルに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]に関連付けられていると思いますが、両方のテーブルで特にasをforeign_keyとしてcurrent_user.uid関連付けているにもかかわらず、なぜそれが検索されないのか理解できません。uid

私は何が間違っているのですか?

ユーザーモデル:

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
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.idます。friends.uidid列であるユーザーの主キーに一致している外部です。これもここでも同じです

belongs_to :user, :foreign_key => "uid"

これを機能させるには、ユーザーの主キーをに設定する必要がありますuid。これをやりたい理由はありますか?

于 2013-02-25T23:46:50.630 に答える