1

我正在尝试在我的应用中过滤用户搜索的结果,以仅显示不是朋友的用户。我的朋友表有 3 列;f1(发送请求的人的用户名),f2(收到请求的朋友的用户名)和确认(真或假的布尔值)。如您所见,@usersfiltered 是搜索的结果。然后建立当前用户好友的定义。然后我试图从搜索结果中删除朋友。这似乎不起作用,但应该非常简单。我试过删除(不好)和销毁。

def index

#THIS IS THE SEARCH RESULT

@usersfiltered = User.where("first_name LIKE?", "%#{params[:first_name]}%" )

#THIS IS DEFINING ROWS ON THE FRIEND TABLE THAT BELONG TO CURRENT USER

@confirmedfriends = Friend.where(:confirmed => true)
friendsapproved = @confirmedfriends.where(:f2 => current_user.id)
friendsrequestedapproved = @confirmedfriends.where(:f1 => current_user.id)

#GOING THROUGH SEARCH RESULTS
@usersfiltered.each do |usersfiltered|

  if friendsapproved.present?
    friendsapproved.each do |fa|
      if usersfiltered.id == fa.f1
 #NEED TO REMOVE THIS FROM RESULTS HERE SOMEHOW
          usersfiltered.remove
      end
    end
  end
#SAME LOGIC
  if friendsrequestedapproved.present?
    friendsrequestedapproved.each do |fra|
      if usersfiltered.id == fra.f2
          usersfiltered.remove
      end
    end
  end

  end

结尾

4

2 回答 2

1

虽然我同意可能有更好的方法来实现你正在做的事情,但我认为你面临的具体问题是在 Rails 4 中,该where方法返回一个ActiveRecord::Relationnot an Array。虽然您可以each在 a 上使用Relation,但通常不能执行数组操作。

但是,您可以使用以下方法将 a 转换Relation为 an :Arrayto_a

@usersfiltered = User.where("first_name LIKE?", "%#{params[:first_name]}%" ).to_a

然后,这将允许您在循环中执行以下操作:

usersfiltered.delete(fa)
于 2013-08-16T23:20:40.653 回答
1

我会把它翻转过来。将循环不变的逻辑从循环中取出,这提供了很好的一阶简化:

approved_ids = []
approved_ids = friendsapproved.map { |fa| fa.f1 } if friendsapproved.present?
approved_ids += friendsrequestedapproved.map { |fra| fra.f2 } if friendsrequestedapproved.present?
approved_ids.uniq!  # (May not be needed)
@usersfiltered.delete_if { |user| approved_ids.include? user.id }

friendsapproved如果并且friendsrequestedapproved严格为了删除的目的而单独创建,这可能会进一步简化。您可以生成一个friendsapproval包含两者的列表,并避免合并上面的 id 集。

于 2013-08-16T22:51:08.460 回答