Выполните итерацию по базе данных и проверьте наличие определенного идентификатора

Я хочу создать метод, который найдет меня и случайную "статью". Дело в том, что я понятия не имею, как перебирать БД, и не получить исключение в случае, если не найден. Как я думаю, что это будет работать (я знаю, что это не рельсовый путь, но у меня нет другой подсказки) Передайте число от Class.first до Class.last, проверьте, существует ли оно (его можно удалить), чем верните объект по рандомизированному идентификатору.

что-то вроде этого:

1.9.3p194 :009 > def test
1.9.3p194 :011?>   until Task.exists?(x)
1.9.3p194 :012?>     print "hmmmmmm"
1.9.3p194 :013?>     x = rand(1..10)
1.9.3p194 :014?>     end
1.9.3p194 :015?>   end

(Когда этот метод будет работать, будет добавлено больше указанных критериев)

2 ответа

Решение

Если вы используете ActiveRecord, вы должны перехватить исключение RecordNotFound и рекурсивно вызвать ваш метод. Для других ORM попробуйте поймать другое исключение.

def ran_find
  x = rand(1..100)
  Task.find(x)
rescue ActiveRecord::RecordNotFound => e
  puts 'hmmmm'
  ran_find
end

Не лучшая реализация, поскольку значения x могут встречаться более одного раза. Но это работает.

Людям нравится использовать параметр ActiveRecord:offset для захвата случайной записи, так как он избегает этого исключения RecordNotFound:

Взято от Toby Hede: Случайная запись в ActiveRecord

offset = rand(Model.count)

rand_record = Model.first(:offset => offset)

Другие вопросы по тегам