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"
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