0

我有一个使用jQuery Tokeninput的带有“自动完成”字段的表单。基本查询仅查找名称或用户名与键入文本匹配的用户,它是:

#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”的查询以根据“@reciprocal follower”进行限制?

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 并移至 relationship_controller.rb 在那里我有“关注”和“取消关注”操作,因为我真的在寻找恰好是用户的关系列表(而不仅仅是寻找返回用户)。如果我将它留在 users_controller.rb 中,我可能应该将它移出“索引”操作。

于 2012-05-06T14:15:12.767 回答