2016-12-06 17 views
0

方法 Friendship.find_by_user_id_and_friend_id(user, friend) & Friendship.find_by_user_id_and_friend_id(friend, user)がnilを与えるなぜ私はわからないよ、 は1は親切に、なぜメソッドがnilを与えるFriendship.find_by_user_id_and_friend_id(user, friend)メソッドfind_by_user_id_and_friend_idが動作していないよう - Railsの5

私にこれを説明できます方法は Friendship.find_by_user_id_and_friend_id(user.id, friend.id)です はありませんか?

>> Friendship.find_by_user_id_and_friend_id(user, friend) 
=> #<Friendship:0x2bf74ec @attributes={"status"=>"pending", "accepted_at"=>nil, 
"id"=>"1", "user_id"=>"1", "position"=>nil, "created_at"=>"2007-01-03 18:34:09", 
"friend_id"=>"1198"}> 

>> Friendship.find_by_user_id_and_friend_id(friend, user) 
=> #<Friendship:0x490a7a0 @attributes={"status"=>"requested", "accepted_at"=>nil 
, "id"=>"2", "user_id"=>"1198", "position"=>nil, "created_at"=>"2007-01-03 18:34 
:20", "friend_id"=>"1"}> 

非常に奇妙な:基本的に1は、私は以下の結果のようなものを取得するとしています信じて

2.3.0 :065 > user 
=> #<User id: 1, email: "[email protected]", created_at: "2016-11-22 15:56:19", updated_at: "2016-12-06 11:39:29", firstname: "richill", lastname: "artloe"> 

2.3.0 :068 > friend 
=> #<User id: 2, email: "[email protected]", created_at: "2016-11-22 16:19:25", updated_at: "2016-11-22 16:19:25", firstname: "emma", lastname: "watson"> 

Friendship.create(user: user, friend: friend, status: 'pending') 
Friendship.create(user: friend, friend: user, status: 'requested') 

2.3.0 :078 > Friendship.find_by_user_id_and_friend_id(user, friend) 
    Friendship Load (0.2ms) SELECT "friendships".* FROM "friendships" WHERE "friendships"."user_id" = ? AND "friendships"."friend_id" = ? LIMIT ? [["user_id", nil], ["friend_id", nil], ["LIMIT", 1]] 
=> nil 
2.3.0 :079 > 

2.3.0 :079 > Friendship.find_by_user_id_and_friend_id(friend, user) 
    Friendship Load (0.2ms) SELECT "friendships".* FROM "friendships" WHERE "friendships"."user_id" = ? AND "friendships"."friend_id" = ? LIMIT ? [["user_id", nil], ["friend_id", nil], ["LIMIT", 1]] 
=> nil 
2.3.0 :080 > 

私に違いを説明できます。これは私に

である理由1は違いが何であるかを説明することができ

Friendship.find_by_user_id_and_friend_id(user, friend) 
=> nil 

:それはこの

Friendship.find_by_user_id_and_friend_id(user.id, friend.id) 
=> #<Friendship id: 1, user_id: 1, friend_id: 2, status: "pending", created_at: "2016-12-06 11:55:06", updated_at: "2016-12-06 11:55:06"> 

ように配置されたときに動作しますが、このように配置されたときに動作しません。

2.3.0 :016 > Friendship.find_by_user_id_and_friend_id(user, friend) 
    Friendship Load (0.2ms) SELECT "friendships".* FROM "friendships" WHERE "friendships"."user_id" = ? AND "friendships"."friend_id" = ? LIMIT ? [["user_id", nil], ["friend_id", nil], ["LIMIT", 1]] 
=> nil 
2.3.0 :017 > Friendship.find_by_user_id_and_friend_id(user.id, friend.id) 
    Friendship Load (0.2ms) SELECT "friendships".* FROM "friendships" WHERE "friendships"."user_id" = ? AND "friendships"."friend_id" = ? LIMIT ? [["user_id", 1], ["friend_id", 2], ["LIMIT", 1]] 
=> #<Friendship id: 1, user_id: 1, friend_id: 2, status: "pending", created_at: "2016-12-06 11:55:06", updated_at: "2016-12-06 11:55:06"> 
2.3.0 :018 > 
+1

私は違いがあるとは思わないが、 'user.id'と' friend.id'を渡してみてください。また、コンソールにいる場合は 'create!'を使用して、友情が作成されていない場合は免除を受け取ります。また、これらの動的な方法を控える。 'find_by(user_id:user.id、friend_id:friend.id)'を使い始める – jvnill

答えて

1

find_by_idメソッドは、見つかった最初のレコードのみを返す以外はwhereメソッドを使用するのと同じです。 (See the source code

このメソッドはidを検索しているので、オブジェクトのインスタンスではなく、直接idを渡す必要があると思います。 .findメソッドを使用する場合も同じです。

関連する問題