Using variables in dynamic finds

Hi

I'm trying to perform a simple find on a class but am having trouble implementing it.

What I want to perform a dynamic find for each different user. The user's location would be variable and I want to display all the relevant venues for that user.

My code currently looks something like this:

@location = @current_user.location

@nearby_venues = Venue.find(:all, :conditions => location_id = @location, :order => 'name')

This does not work however. I've tried changing the conditions statement around a bit but with no luck.

If anybody could tell me how to perform this find, it'd really help me out.

Thanks in advance.

You need to correct your :conditions

:conditions => {:location_id => @location.id}

@nearby_venues = Venue.find(:all, :conditions => {:location_id =

@location.id}, :order => 'name')

should work in that case

Cheers, that worked perfectly.

What I'm trying to do now is to list the events which belong to these "nearby_venues" and which occur after todays date. I have no problem in getting the events from the nearby venues but am having problems when trying to couple this with the date condiiton.

My current code looks like this:

@today = Date.today

@upcoming_events = Event.find(:all, :conditions => {"venue_id = ? and date > ?", @nearby_venues, @today}, order => date)

This throws up an error since theres more than one value in @nearby_venues so I try using the solution given above, and it looks as follows:

@upcoming_events = Event.find(:all, :conditions => {:venue_id => @nearby_venues and :date > @today}, order => date)

This doesn't work either however, any advice?

Oops, that doesn't even look like syntatically correct ruby. You can't use the ever so trendy hash form of conditions for this, ie you need to use the more boring sql fragment form. There are examples in the api docs for ActiveRecord.

Fred

several details wrong here :slight_smile:

- :conditions => {...} is defining a hash. You can't use "and" within that, only key/value pairs. So you must use one of the alternative syntax variants:

@upcoming_events = Event.find(:all, :conditions => ["venue_id IN (?) AND date > '?' ", @nearby_venues.join(","), Time.now.to_s(:db) ], order => date)

so using a kind of SQL string, the variable part replaced by question marks and the values to be filled in for the ? directly following the string

@upcoming_events = Event.find(:all, :conditions => ["venue_id IN (?) AND date > '?' ", @nearby_venues.join(","), Time.now.to_s(:db) ], order => date)

A minor tidyup: the above is equivalent to

@upcoming_events = Event.find(:all, :conditions => ["venue_id IN (?) AND date > ? ", @nearby_venues, Time.now ], order => 'date')

Active Record takes care of the boring stuff like creating the comma separated list of ids and so on.

Fred

This is what I like so much about AR.

I think Date.today might be more logically correct than using Time.now, though.

I think Date.today might be more logically correct than using Time.now, though.

Depends on some details. the results:

Date.today: "2008-09-25" Time.now: "2008-09-25 11:56:21"

So Date.today would get you all records of today, including those from the morning to now. Time.now includes the time, ignoring the records at morning.

Somehow Time.now is a bit more often seen, but that may have any other reason.

I just noticed that Gearóid originally used the @today variable, so I was kind of thinking that he meant dates and not datetimes. Both would work though, assuming the field "date" is just a date.

Working perfectly, thanks a lot.