Adding a smart date attribute for Sequel
When you have dates on your form you always want to present them in a usable format for your users but this means you must then parse them back into a SQL format before updating your model. I found the very cool gem Chronic that will do the parsing for us. The only thing left to do is make a method to easily use Chronic in our models. For this we will use meta programming. Oh, I use Sequel as my ORM of choice but this could be applied to any ORM and even just plain classes if you’d like.
require "chronic"
class Sequel::Model
def self.smart_date_attr(*args)
args.each do |a|
define_method("#{a}=".to_sym) do |v|
super(Chronic.parse(v))
end
end
end
end
That’s it! Now all we have to do on our models is specify which attributes should be a smart date:
class Person < Sequel::Model(:people)
smart_date_attr :date_of_birth, :anniversary
end
Now we can make use of this right away. Here is an IRB session on one of my models:
irb(main):003:0> c.received_date = "today"
=> "today"
irb(main):004:0> c.received_date
=> #
irb(main):005:0> c.received_date = "3 days ago"
=> "3 days ago"
irb(main):006:0> c.received_date
=> #
irb(main):007:0> c.received_date = "5/5/1955"
=> "5/5/1955"
irb(main):008:0> c.received_date
=> #