Ruby enterprise legacy issues

Hi,

trying to use RoR in an enterprise setting (i.e. with legacy
databases) and am having problems with AR objects where a db column
has the same name as a RoR reserved word, 'notify' in this case.

How do I get round the issue? Renaming the column is not an option
since other applications are also using the database.

I thought about stifling RoR feature where it generates the read
methods (e.g. notify(), notify=() and notify?() )for each column name
and can see that these ought not to be generated when
ActiveRecord::Base.generate_read_methods is false but I don't really
want to do this for all models, only those with legacy databases.

Any ideas?

Allan

You can use the attributes hash to access the columns (model[:notify] works too), and create getter/setter methods like notify_column() and notify_column=() to get around the naming clash.

The ActiveRecord::Base API lives in the same namespace as the attributes of model classes. That means there can be occasional clashes. One way to deal with that is to always enforce a separation of namespaces, but that makes the API more heavyweight. ActiveRecord strikes a pretty good balance between making the API lightweight, and allowing you a second way to access attributes when there are name clashes.

By the way, this list is not for support issues. Those should be sent to rubyonrails-talk@googlegroups.com.

You can use the attributes hash to access the columns (model[:notify]
works too), and create getter/setter methods like notify_column() and
notify_column=() to get around the naming clash.

True, but I don't even want to touch the notify column, the problem
happens when I access another column/attribute and then try to save
the record. The Model#notify method is created as soon as I touch the
model in any way (even just to re-save it w/o any changes in
attributes) and it's during the save process that the Model#notify
method is called, this time with an argument which, of course is a
problem since the notify method is now defined with no arguments:

r=RegressionData.find(:first)

=> #<RegressionData ID: 681, status: "N/A", notify: "", num_wpnts: 0,
num_bpnts: 0>

r.save

ArgumentError: wrong number of arguments (1 for 0)
        from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3.7116/lib/
active_record/callbacks.rb:332:in `notify'
        from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3.7116/lib/
active_record/callbacks.rb:332:in `callback'
...

So without touching the object I cannot save it.

The ActiveRecord::Base API lives in the same namespace as the
attributes of model classes. That means there can be occasional
clashes. One way to deal with that is to always enforce a separation
of namespaces, but that makes the API more heavyweight. ActiveRecord
strikes a pretty good balance between making the API lightweight, and
allowing you a second way to access attributes when there are name
clashes.

I'd like AR to allow me to turn off the possibility of clashing (on
certain models :slight_smile: and only be able to use the second way to access
attributes.

By the way, this list is not for support issues. Those should be sent
to rubyonrails-talk@googlegroups.com.

I appreciate that point and your response to my point. Is this not a
core issue to legacy database support though?

BTW, nobody has made any comment to the same issue posted on the
rubyonrails-talk group, I guess it's just me being dumb or unlucky!

Thanks,

Allan