find() performance

I want my application URL's to have the name of products in the URL as opposed to the id, like so:

/product/windows+xp instead of /product/view/1 /product/windows+xp/edit instead of /product/edit/1

I assume the best way then would be in the controller to use:

def view   @product = Product.find_by_name(params[:name]) end

instead of

def view   @product = Product.find(params[:id]) end

So my question is:

1) Would find_by_name degrade performance significantly because I'm searching by name now and not by row?

If so, 2) is there a better way to handle the find in a more efficient way and still use the string name in the URL's?

Happy holidays, Chad

That seems like a reasonable approach to me, assuming you configure the routes accordingly. Performance will be slower due to the nature of the search, but not by much. I would suggest dropping an index onto the name field.

A nice way to do this is to use the acts_as_sluggable plugin:

http://www.agilewebdevelopment.com/plugins/acts_as_sluggable http://dev.2750flesk.com/acts_as_sluggable/

You can then use it in your model like this:

class Article < ActiveRecord::Base

    acts_as_sluggable :with => 'title'

  end

A link in your view would be:

link_to 'Read article', :action => 'show', :id => @article

And the URL it generates would look like:

/articles/show/76-omg-my-cat-is-so-cute-lol

I'm using acts_as_sluggable in a couple different Rails applications and it's working very nicely for me, a live example is:

http://www.lovemygarden.net/resources/article/1-testing-and-amending-garden-soil

yours, sness. http://www.sness.net

I want my application URL’s to have the name of products in the URL as opposed to the id, like so:

/product/windows+xp instead of /product/view/1 /product/windows+xp/edit instead of /product/edit/1

I assume the best way then would be in the controller to use:

def view @product = Product.find_by_name(params[:name]) end

instead of

def view @product = Product.find(params[:id])

end

This link does a good job of explaining, and linking to other resources on the subject. http://www.tonyspencer.com/2007/02/04/better-search-engine-friendly-urls-with-ruby-on-rails/

On 12/17/06, *Chad Arimura* <carimura@gmail.com

    If so, 2) is there a better way to handle the find in a more     efficient way     and still use the string name in the URL's?

Take a look at Tressle http://trestle.rubyforge.org/ and http://www.rubyinside.com/trestles-replacing-rails-scaffolding-with-something-better-138.html

/people Lists existing person records /people/new GET Shows an empty person form                 POST Creates a new person record from request parameters /people/99 Shows the person record having ID 99 /people/99/edit GET Shows a person form for the record having ID 99     POST Updates the person record having ID 99 using request                         parameters /people/99/destroy GET Redirects to /people/99/edit with a notice                                 that the user must click the form’s Destroy

                                button in order to destroy a record       POST Deletes the person record having ID 99 after                                 prompting the user for confirmation

Personally I hate the verb-object form and I hate the :id as an absolute. We see in wikis and blogs the use of a name parameter

  /people/jack

There are many settings where you don't want the user/hacker to step through the numbers.

I'm a user of TWiki as a wiki and I find the "http://twiki.org/cgi-bin/view/web/topic&quot; annoying. The "cgi-bin/view" is not needed, and as Nils Jonsson's article points out, the move from view to edit is easier if the verb is a suffix.

One day I'll figure out the mapping for

      /web/topic /web/topic/edit       /web.topic /web.topic/edit       /web.topic?edit       /web.topic?edit&skin=cosmos       /web/topic?raw=on

and so forth