метод ruby ​​возвращает истину или ложь

Я хочу получить из метода ruby ​​true, если за каждым сообщением следят люди, и false, если нет.

У меня есть этот метод:

def number_of_posts_that_are_followed
  user_to_be_followed = User.find(params[:id]) #users whose posts, will be followed by another user
  user_to_be_followed.posts.each do |this_post| 
    if current_user.follows?(this_board) == true #method that returns true if the current_user is following this post of the user whose posts will be followed
     return true
    else
     return false
    end 
   end
  end

Проблема в том, что этот метод возвращает true, если за первым сообщением (в первой итерации) следует текущий_пользователь. Я хочу вернуть true, если за каждым сообщением следят, или false, если нет.

Я попытался поставить счет следующим образом:

count = user_to_be_followed.posts.count

person hyperrjas    schedule 29.01.2012    source источник


Ответы (3)


Вы должны использовать Enumerable#all? для проверки того, что все элементы списка соответствуют условию, определенному в предикате (блок, который возвращает логическое значение).

все? [{|объект| блок } ] → true или false

Передает каждый элемент коллекции в заданный блок. Метод возвращает true, если блок никогда не возвращает false или nil. Если блок не задан, Ruby добавляет неявный блок {|obj| obj} (это все? вернет true, только если ни один из элементов коллекции не равен false или равен нулю.)

def number_of_posts_that_are_followed
  User.find(params[:id]).posts.all? {|post| current_user.follows? post }
end
person Aliaksei Kliuchnikau    schedule 29.01.2012

Небольшой рефакторинг SimonMayer'а:

def number_of_posts_that_are_followed
  User.find(params[:id]).posts.each do |this_post| 
    return false unless current_user.follows?(this_post)
  end
  true
end

РЕДАКТИРОВАТЬ: Еще короче, в рубиновом стиле:

def number_of_posts_that_are_followed
  User.find(params[:id]).posts.map do |this_post| 
    not current_user.follows?(this_post)
  end.any?
end
person tomferon    schedule 29.01.2012

person    schedule
comment
Я не проверял, но вы также можете использовать break в строке сразу после value = false, чтобы предотвратить дополнительное зацикливание. - person SimonMayer; 29.01.2012
comment
Что касается вашей кармы, я принимаю ваш ответ. Он отлично работает :D. Большое тебе спасибо. - person hyperrjas; 29.01.2012