Одна проблема - в ваших условиях есть синтаксическая ошибка. Неверная запись хеша:
:conditions => [:letter => letter]
должно быть
:conditions => {:letter => letter}
Кроме того, мне кажется, что ваш случайный прицел всегда будет исключать первое изображение, если вы не допустите смещение 0. Кроме того, вы действительно хотите вернуть nil, если случайное число было 0?
Picture.random (a) .image (: thumb) будет генерировать исключение "неопределенный метод 'image' для исключения nil: NilClass" каждый раз, когда c == 0. Вероятно, можно просто использовать:
def self.random(letter)
find(:first, :conditions => {:letter => letter}, :offset =>rand(count))
end
РЕДАКТИРОВАТЬ: Вам нужно будет либо гарантировать, что в вашей БД есть изображения для всех букв, либо сообщить пользователю, что для данной буквы нет изображения.
<% @letters.each do |a| %>
<% if pic = Picture.random(a).image(:thumb) %>
<%= pic.image(:thumb) %>
<% else %>
No image available for <%= a %>
<% end %>
<% end %>
или тому подобное ...
РЕДАКТИРОВАТЬ: На самом деле я не думаю, что ваша стратегия смещения будет работать. Еще один подход - вернуть набор изображений, доступных для данной буквы, и случайным образом выбрать из этой коллекции что-то вроде:
def self.random(letter)
pics = find(:all, :conditions => {:letter => letter})
pics[rand(pics.size)] if !pics.blank?
end