filter dates from where clause

17 views
Skip to first unread message

Joe Guerra

unread,
Jan 29, 2017, 1:29:03 PM1/29/17
to Ruby on Rails: Talk
I'm trying to figure out how to compare my enddate > Time.now in my where clause.

enddate is a date field, I'm just trying to only display products that haven't expired (by the date field).


I've tried...

require 'time'

products.where(['enddate > ?', Time.now]) 

Joe Guerra

unread,
Jan 29, 2017, 1:50:56 PM1/29/17
to Ruby on Rails: Talk
ok, I've kind of figured it out.  but I need to combine my where clause now...



require 'time'

todaydate = Time.new
# set 'todaydate' equal to the current date/time.

todaydate = todaydate.year.to_s + "-" + todaydate.month.to_s + "-" + todaydate.day.to_s


@title = @category.name
@products = @category.products.where( 'draft' => false, 'active' => true, 'funded' => false)

    @products = @category.products.where('enddate > ?', todaydate ) 



j...@room118solutions.com

unread,
Jan 29, 2017, 10:01:49 PM1/29/17
to Ruby on Rails: Talk
ActiveRecord will handle converting a Time into something your database understands, so you don't need to worry about that.  You can also write the where clause manually like you did, or you can use arel, which would be my preference.  You can also chain .where()'s, since they just return ActiveRecord::Relations and don't actually execute until they need to.  Here's how you could rewrite your code:

@products = category.products.where( 'draft' => false, 'active' => true, 'funded' => false).where(Product.arel_table[:enddate].gt(Time.now))

I would personally define that as a scope on the Product model:

scope :not_expired, -> { arel_table[:enddate].gt(Time.now) }

And then your code could become:

@products = category.products.not_expired.where( 'draft' => false, 'active' => true, 'funded' => false)

I would also probably create scopes for all of those other conditions, or maybe wrap them into a single scope if you can produce a term that accurately describes products that are in that exact state.

On Sunday, January 29, 2017 at 1:29:03 PM UTC-5, Joe Guerra wrote:

Joe Guerra

unread,
Jan 30, 2017, 10:55:27 AM1/30/17
to Ruby on Rails: Talk
Thanks.   I got it combined.   I'll try using the scope in the product model.
Reply all
Reply to author
Forward
0 new messages