23526

[code]

    where("id not in (?) AND id != ?", current_user.friend_ids, current_user)
    
[/code]

と書かれたコードがありまして、コードの記述の意味がわかりません。  
このコードはツイッターのようなサイトの”友達を探す”ページのコントローラーの一部です。  
まず、`"id not in (?) AND id != ?"`の部分の意味がわかりません。なぜANDを使っているのか 、(?) はどのような意味なのかid
!= ?がどんなことを意味しているのかさっぱりわかりません。どなたかこのコードの記述の仕方とその意味を教えてください。

ちなみにコントローラーのコードの全体は  
find_friends_controller.rb

[code]

    class FindFriendsController < ApplicationController
    
      before_action :authenticate_user!
    
      def index
        @users = User.where("id not in (?) AND id != ?", current_user.friend_ids, current_user).paginate(page: params[:page])
        respond_to do |format|
          format.js
          format.html
        end
      end
    end
    
[/code]

のようになっています。

どうしてあんな複雑で難解なコードで友達が探せるのか疑問です。。。


CC BY-SA 3.0
2016-03-28T02:04:09.857
23523
2016-03-28T02:30:51.037
14754
question
ruby-on-rails
where("id not in (?) AND id != ?", current_user.friend_ids, current_user)のコードの意味

[code]

    where("id not in (?) AND id != ?", current_user.friend_ids, current_user)
    
[/code]

この `?` の部分には、後続のパラメータが順番に埋め込まれます。コメントとして埋め込んでみると、

[code]

    id not in (/*friend_ids*/) AND id != /*current_user*/
    
[/code]

といった形になります。このクエリはUserモデルに対して投げていますから、

  * `id not in (/*friend_ids*/)` 現在の友達のIDリストに含まれない＝まだ友達でない
  * `AND` かつ
  * `id != /*current_user*/` 自分自身でもない

という条件を満たすユーザーを列挙していることになります。

実際にはこの `where()` 呼び出しは `WHERE id not in (1,2,3,...) AND id != 8`
といった形に変換され、SQLに埋め込まれることになります。ですから `where()`
で使う式がどのような構造になっていて、何が書けるのかは、SQLのWHERE句について調べるとよいでしょう。

例えば： [SELECT構文：WHEREで検索条件を設定する | Smart](http://rfs.jp/sb/sql/s03/03_2-2.html)


CC BY-SA 3.0
2016-03-28T02:30:51.037
23526
2016-03-28T02:30:51.037
8000
23523
answer