2009-10-10 2 views
0

Если я знаю, что ответы, которые current_user «s, потому что User модель имеет answers коллекции:Тестирование на членство в коллекции

current_user.answers 

Как я могу проверить, содержит ли что answers коллекция текущий ответ (на который ссылается @answer переменная класса) на каждом шаге цикла?

У меня возникло искушение использовать включенные? Метод:

current_user.answers.include?(@answer) 

, но я вижу, что это за Mixins :(

+3

Что вы имеете в виду вы «видите' включить? 'Для Mixins»? Это нормальный способ сделать это. – Chuck

+0

@ Чак - Я имел в виду, что я читал о включении? и он сказал, что это для модулей не для коллекций. Итак, если вы хотите проверить, включает ли класс определенный модуль, который вы бы включили? Я не уверен, как это можно использовать с коллекцией. –

+0

Джо, вы можете запутаться в методе обратного вызова класса «включено» класса Ruby (или оператора include). Ваш код, как показано, будет работать нормально, хотя «существует?» метод, описанный ниже cwninja, проще в базе данных и предпочтительнее в этом прецеденте. – pauliephonic

ответ

1

Все перечислимые коллекции (включая массивы, хэши и наборы) имеют метод include? для проверки членства.

[1,2,3].include? 2 # => true 
{foo: 'foo', bar: 'bar'}.include? :foo # => true 
[1,2,3].include? 5 # => false 

(Там же include? метод, модули имеют, но это не то же самое.)

+0

Чак: Спасибо за разъяснение различия. –

3

Вы можете быть лучше от делать это в базе данных:

current_user.answers.exists?(@answer.id) 

Это будет выполнять select id from answers where id = ? and user_id = ? и вернуть true если он существует.

Если у вас уже есть ответы, загруженные в память, include? должен работать, или any?{|ans| ans.id == @answer.id} или сплющить их все в набор идентификаторов вне цикла:

Set.new(current_user.answers.map(&:id) 

, а затем тест для включения идентификатора внутри цикла.

+0

Awesome. Спасибо чувак! –

Смежные вопросы