Does find return true or false?

If I do a find such as order = Order.find_by_name("John") will 'order' be set to false ? I want to make a condition where if no record is found , something happens. So far no luck with the above though , thought I could confirm

TIA Stuart

Hi Stuart,

Dark Ambient wrote:

If I do a find such as order = Order.find_by_name("John") will 'order' be set to false ?

I believe you'll find that what 'find' returns depends on what you ask it for. I think if you ask it to 'find first' it returns either a single record or nil, and if you ask it to 'find all' it returns a (possibly empty) array.

hth, Bill

Find will return nil when no record is found - so order will effectively be false.

This should work for you:

order = Order.find_by_name(“John”) unless order

handle record not found

end

Here's my problem now :slight_smile: I am attempting to check for records before allowing user to do a create. The problem is in the first line. current_user.id should be available because I can get it to print out in various views and it's in the application.rb controller. However it doesn't seem to take. To test my method , if i say user_id = 10, then things work. in the Cdetail model user_id is a method (column). So basically what I'm trying to say here is count how many records user_id with the value of current_user.id has. i.e. right now i'm the only one on the system, so my current_user.id is 10. Somehow this translation is not taking place ?

def check_forec       @result = Cdetail.count "user_id = current_user.id"       if @result >= 1       flash.now[:warning] = 'Record Alread exists'       redirect_to(:controller => 'index', :action => 'index')       end       end

Stuart

The string “user_id = current_user.id” is being passed straight into SQL, where it probably just gives an error. You want “user_id = #{current_user.id}”, which will insert the value of current_user.id into the string.

However, what you are doing seems like a major re-invention of the wheel - you’re doing all the work for a has_one association. You probably want your

models to look like this:

class Cdetail < ActiveRecord::Base belongs_to :user end

class User < ActiveRecord::Base has_one :cdetail, :dependent => :destroy end

The “:dependent => :destroy” part will ensure that Cdetail records are not

left hanging around without associated User objects.

With that set up, you can access the associated Cdetail record like this:

current_user.cdetail

and figure out if one exists with

current_user.cdetail.nil?

Hope this helps,

Matt - Thank you so much and btw, apologies for the cross post. I think I could use some remedial Ruby and go back to the books. I completely forgot the #{ }. I did have the associations set up but no the destory but it makes sense.

Stuart

Take a look at the "validates_unique" validator, in addition to what Matt Jones has already said.

I'm having a hard time using 'current_user.cdetail.nil?' in a before filter. Maybe it's the way I'm writing it out. However the way things are set up cdetails/new will create a new record. I wanted the filter in the event that one existed. I guess it could be changed to ask if it's 'not nil'.

Stuart

I thought about the validates_unique, however this is a situation where the user would create one record and then have the option later of edit and destroy. I wouldn't want the user to enter in the information again only to have the form bounce back.

Stuart

That's a pretty common pattern - you can bounce it back with an error message, WITH all his information intact to retry or do whatever.