Все эти решения используют find_by_name
, что определенно потребует наличия индекса для этого столбца и требует, чтобы они были уникальными. Лучшее решение, которое мы использовали, жертвуя небольшим количеством красоты, состоит в том, чтобы использовать префикс имени поставщика с его идентификатором. Это означает, что вам не нужно иметь индекс для вашего столбца имени и / или требовать уникальности.
vendor.rb
def to_param
normalized_name = name.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '')
"#{self.id}-#{normalized_name}"
end
Так что это даст вам URL-адреса, такие как
/ 1-Acme
/ 19-Safeway
и т.д.
Тогда в вашем шоу-действии вы все еще можете использовать
Vendor.find(params[:id])
, поскольку этот метод будет неявно вызывать .to_i
для своего аргумента, а вызов to_i
для такой строки всегда будет возвращать числовой префикс и отбрасывать оставшийся текст - весь этот пух в этой точке.
Вышеприведенное предполагает, что вы используете маршрут по умолчанию /:controller/:action/:id
, из-за которого ваши URL выглядят как
/ продавцы / шоу / 1-акме
Но если вы хотите, чтобы они просто смотрели
/ 1-Acme
Тогда есть маршрут как
map.show_vendor '/:id', :controller => 'vendors', :action => 'show'
Это будет означать, что это будет в значительной степени поглощать множество URL, которые вы, вероятно, тоже не захотите. Примите предупреждение.