jQueryTokeninputを使用する「オートコンプリート」フィールドを持つフォームがあります。名前またはユーザー名が入力されたテキストと一致するユーザーを検索する基本的なクエリは次のとおりです。
#users_controller.rb
def index
@users = User.where("LOWER(name) like ? OR LOWER(username) like ?", "%#{params[:q].downcase}%", "%#{params[:q].downcase}%").order('name ASC').limit(10) if params[:q]
respond_to do |format|
format.html # index.html.erb
format.json { render json: @users, :only => [:id, :name, :username] }
end
これはうまく機能します。
私のアプリにも「フォロワーモデル」があり、「相互フォロワー」のみが返されるように、オートコンプリートフィールドに表示されるユーザーを制限したいと思います。「相互フォロワー」とは、私をフォローしている人のことです[(AはBをフォロー)AND(BはAをフォロー)]。
Userモデルに、ユーザーの相互フォロワーを返すメソッドがあります。
#user.rb
# Users relation to Relationships
has_many :relationships, :foreign_key => "follower_id", :dependent => :destroy
has_many :followed_users, :through => :relationships, :source => :followed
has_many :reverse_relationships, :foreign_key => "followed_id",
:class_name => "Relationship",
:dependent => :destroy
has_many :followers, :through => :reverse_relationships, :source => :follower
def reciprocal_followers
self.followers & self.followed_users
end
テキストを入力している人の相互フォロワーを取得できます。
@reciprocal_followers = current_user.reciprocal_followers
しかし、入力されたテキストに応じて、そのリストをどのように整理すればよいでしょうか。既存のオートコンプリート(@users = User.where ...)クエリを@reciprocal_followersと統合するにはどうすればよいですか?
英語:「オートコンプリートで、ユーザーがオートコンプリートフィールドに入力したものと同じ名前またはユーザー名を持つ最大10人の相互ユーザーのリストを表示したい」。
「@users」を定義するクエリを「@reciprocalfollowers」に従って制限するように変更するにはどうすればよいですか?