2013-08-16 4 views
1

Я пытаюсь отфильтровать результаты поиска пользователей в своем приложении, чтобы показывать только пользователей, которые НЕ являются друзьями. Таблица моих друзей имеет 3 столбца; f1 (идентификатор пользователя, отправившего запрос), f2 (имя пользователя друга, получившего запрос) и подтвержденное (логическое значение true или false). Как вы можете видеть, @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 

конец

+0

Вместо ' remove' try using 'destroy' –

+0

не будет уничтожать пользователя? – brad

+0

Да, извините, я думаю, что неправильно понял ваш вопрос. –

ответ

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, состоящий из обоих, и избегать объединений идентификаторов выше.

+0

это сработало. благодаря! – brad

1

Хотя я согласен, что может быть лучше, способы реализации, что вы делаете, я думаю, что конкретная проблема, вы столкнулись в том, что в Rails 4, метод where возвращает ActiveRecord::Relation не Array. Хотя вы можете использовать each на Relation, вы не можете вообще выполнять операции массива.

Однако, вы можете преобразовать Relation к Array с методом to_a как в:

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

Это затем позволит вам сделать следующее в вашем цикле:

usersfiltered.delete(fa) 
Смежные вопросы