0

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」に従って制限するように変更するにはどうすればよいですか?

4

1 に答える 1

0

これが私が解決したものです:

@users = current_user.reciprocal_followers.select {|u| u.name.downcase =~ /#{params[:q].downcase}/ || u.username.downcase =~ /#{params[:q].downcase}/}.sort_by { |u| [u.name, u.username] }.first(10) if params[:q]

友人はまた、これをusers_controller.rbからrelationships_controller.rbに移動することを勧めました。ここでは、ユーザーである可能性のある関係のリストを実際に探しているので、「フォロー」アクションと「フォロー解除」アクションがあります。リターンユーザー)。users_controller.rbに残しておくと、おそらく「インデックス」アクションから移動する必要があります。

于 2012-05-06T14:15:12.767 に答える