Shlomo Zalman Heigh
Shlomo Zalman Heigh

Reputation: 3978

Get records where date.year == some_year in Rails

I have a date column in my database in a Rails 3.1 app, and I want to be able to get the records where the date's year matches a specific year. I tried where(:date.year == year) but of course I got NoMethodError: undefined method 'year' for :date:Symbol. Is it possible to do this type of query?

Upvotes: 5

Views: 7881

Answers (4)

Lane
Lane

Reputation: 4986

In your Model:

scope :by_year, lambda { |year| where('extract(year from created_at) = ?', year) }

In your Controller:

@courses = Course.by_year(params[:year])

Upvotes: 3

Taryn East
Taryn East

Reputation: 27747

Jesse gave you, I think, the idea for the actual solution, but to explain why this failed - it's because it tried to evaluate ".year" as a method on the symbol you passed it: ":date".

The word :date is just a parameter to tell "where" which value it will later use to construct the SQL query to pass to the db. It doesn't turn into the actual date of the record. But the ".year" will evaluate as you're passing it as a parameter, before anything has been done with the ":date" symbol.

Upvotes: 1

Moon
Moon

Reputation: 35265

Assuming your date format is: YYYY-MM-DD HH:MM:SS

Try this:

where(Date.strptime(:date, "%Y-%m-%d %H:%M:%S").year == year)

OR

where(["YEAR(?) = ?", :date, year])

Upvotes: 0

Jesse Wolgamott
Jesse Wolgamott

Reputation: 40277

You can use a scope to build something like:

scope :for_year, lambda {|date| where("date >= ? and date <= ?", "#{date.year}0101", "#{date.year}1231")}

Upvotes: 7

Related Questions