Strange behaviour of dates


#1

Imagine a crud app that tracks people applying for a loan, here is the
layout I have:

Mysql database:
create table apps (
id int auto_increment primary key,
primary_id int not null,
secondary_id int null,
constraint fk_primary_id foreign key(primary_id) references
(contacts.id),
constraint fk_secondary_id foreign key(secondary_id) references
(contacts.id))

create table contacts (
Id int auto_increment primary key,
Name char not null,
Date_of_birth date not null)

Models
app.rb
class App < ActiveRecord::Base
belongs_to :primary,
:class_name => “Contact”,
:foreign_key => “primary_id”
belongs_to :secondary,
:class_name => “Contact”,
:foreign_key => “secondary_id”
end

contact.rb
class Contact < ActiveRecord::Base
has_many :apps_issued,
:class_name => “App”,
:foreign_key => “primary_id”
has_many :apps,
:class_name => “App”,
:foreign_key => “secondary_id”
end

I have controllers to edit contacts individually and as a whole
application.
When I look at the controller Contact from a browser and select a
contact to
edit I get the proper form up on screen and this section:

  <label for="contact_date_of_birth"><b>Date of birth: 


<%= date_select ‘contact’, ‘date_of_birth’, :start_year => 1900 %>

Returns 3 drop downs that are auto populated with the contacts dob in
the
database.

Now when I go to the /App controller and get my list, I have a custom
find
the basically looks like this:

def edit
@app = App.find(params[:id],
:joins => “LEFT OUTER JOIN contacts ON
apps.primary_id=contacts.id LEFT OUTER JOIN contacts AS secondary ON
apps.secondary_id=secondary_id”,
:select => “apps.id, contacts.name as primary_name,
contacts.date_of_birth as primary_date_of_birth, secondary.name as
secondary_name, secondary.date_of_birth as secondary_date_of_birth”)
end

This line in my _edit.rhtml:

Date of birth:

<%= date_select ‘app’, ‘primary_date_of_birth’, :start_year => 1900 %>

returns:

Showing app/views/app/_edit.rhtml where line #36 raised:

undefined method `year’ for “1993-02-05”:String

/usr/local/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_view/helpers/
date_helper.rb:222:in select_year' /usr/local/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_view/helpers/ date_helper.rb:275:into_date_select_tag_without_error_wrapping’
/usr/local/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_view/helpers/
date_helper.rb:274:in to_date_select_tag_without_error_wrapping' /usr/local/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_view/helpers/ active_record_helper.rb:170:into_date_select_tag’
/usr/local/lib/ruby/gems/1.8/gems/actionpack-1.11.2/lib/action_view/helpers/
date_helper.rb:80:in `date_select’
#{RAILS_ROOT}/app/views/app/_edit.rhtml:36

So I guess the question of the century is what is done to the date of
birth
when the Contact controller accesses it with the default find(:all) that
is
not being done to it when I do my custom find that results in the error?

Any and all help will be greatly appreciated.


#2

Daniel Salinas wrote:

secondary_name, secondary.date_of_birth as secondary_date_of_birth")
Showing app/views/app/_edit.rhtml where line #36 raised:

undefined method `year’ for “1993-02-05”:String

Extra-table attributes that are tacked onto a model instance using a
custom select, as well plain attr_accessor attributes, aren’t typed
column objects which can be used with multi-parameter AR helpers.

Instead use:

<%= select_date @app.primary_date_of_birth,
:prefix => ‘app[primary_date_of_birth]’,
:start_year => 1900 %>

And in the app model:

def primary_date_of_birth
Date.parse( self[primary_date_of_birth] )
end

def primary_date_of_birth= (d)
self[:primary_date_of_birth] = Date.new(d[:year],d[:month],d[:day])
end


We develop, watch us RoR, in numbers too big to ignore.