Hi Folks,
I’m new to Rails (and Ruby), and right off the bat, I need to work
with a legacy database (SQL Server 2008). I’m having trouble building
my models and specifying the associations. The primary key of each
table is a field called “ID”, but it is not an auto-incrementing
integer. It’s a UUID. The table names are not plurals and some of
them are reserved words n Ruby, the field names are all-caps, except
for the field called ‘Type’.
Let me show you three tables and their corresponding models:
create table CLASSIFICATION (
ID uniqueidentifier primary key not null,
CLASS_TEXT varchar(64) not null
)
create table TABLE_SCHEMA (
ID uniqueidentifier primary key not null,
TABLE_NAME varchar(255) not null,
DISPLAY_NAME varchar(255) not null,
Type tinyint not null,
DESCR varchar(255),
DELETED_FLAG bit not null default 0,
CLASS_ID uniqueidentifier not null
)
create table OBJECT (
ID uniqueidentifier primary key not null,
PHYSICAL_NAME varchar(255) not null,
DISPLAY_NAME varchar(255) not null,
DELETED_FLAG bit not null default 0,
CLASS_ID uniqueidentifier not null
)
±-------------------------+
±-------------------------+
| |
<---------------------------| |
| CLASSIFICATION | | TABLE_SCHEMA |
| |<-------+ ±----
| |
±-------------------------+ | |
±--------------------------+
| |
±------------+
| |
| OBJECT |
| |
±------------+
Here are my models:
class Classification < ActiveRecord::Base
set_table_name ‘classification’
set_primary_key ‘id’
has_many :table_schemas,
:class_name => ‘TableSchema’,
:foreign_key => ‘class_id’
has_many :my_objects,
:class_name => ‘MyObject’,
:foreign_key => ‘class_id’
every model has setUuid, so I won’t show it in the other models
before_save :setUuid
private
def setUuid
self.ID = UUIDTools::UUID.timestamp_create()
end
end
class TableSchema < ActiveRecord::Base
set_table_name ‘table_schema’
set_primary_key ‘id’
self.inheritance_column = nil # because one of the columns is ‘Type’
has_many :my_objects,
:class_name => ‘MyObject’,
:foreign_key => ‘table_id’
belongs_to :classification,
:class_name => ‘Classification’,
:foreign_key => ‘class_id’
end
class MyObject < ActiveRecord::Base # can’t call the class
“Object”
set_table_name ‘object’
set_primary_key ‘id’
belongs_to :table_schema,
:class_name => ‘TableSchema’,
:foreign_key => ‘table_id’
belongs_to :classification,
:class_name => ‘Classification’,
:foreign_key => ‘class_id’
end
In the Rails console:
irb> ts = TableSchema.find(:first, :conditions => “table_name =
‘ENTITY_INST’”)
=> [#<TableSchema ID: “88E65D47-621C-4DD6-BD6F-B9ABD93437F8”,
TABLE_NAME: “ENTITY_INST”, DISPLAY_NAME: “Entity Instance”
, TYPE: 1, DESCR: “All “real things” - by label”, DELETED_FLAG:
false, CLASS_ID: “085F7B9E-3
99D-48AD-A7A3-2AD48769F99B”>]
irb> ts.my_objects
NoMethodError: undefined method `my_objects’ for #Array:0x47c5830
irb> c = Classification.last
=> #<Classification ID: “3E3A8383-8469-4847-8485-C6761B09FD46”,
CLASS_TEXT: “UNCLASSIFIED”>
irb> c.my_objects
=> []
- Why is ts.my_objects not defined, but c.my_objects IS (apparently)
defined? - c.my_objects should return dozens of MyObject objects. Why does it
return none?
- Mark
I’m using Rails 3.0.3
Ruby 1.8.7
SQL Server 2008
Windows XP ()