Forum: Ruby on Rails Newbie needing help on Legacy DB Rails Concepts

Announcement (2017-05-07): is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see and for other Rails- und Ruby-related community platforms.
Auch (Guest)
on 2008-11-13 03:49
(Received via mailing list)

I have limited success with rails and am trying very hard to
understand the MVC, DRY and RESTful concepts that Rails supports.

What I am trying to do is to automate some data manipulation
procedures for legacy systems. I have three tables that I need to
import into the Rails application.

Table 1
Legacy_System_ID1, Agency_Business_Number, Agency_Name
belongs to Table 3
belongs to Table 1

Table 2
Legacy_System_ID2, Legacy_System_ID1, Legacy_System_Contact_ID,
Agency_Business_Number, Agency_name
has many Table 1

Table 3
Agency_Business_Number, Agency_Name.
has many Table 1

These files are all in csv format. What I am having trouble with is
the concept of primary key ids. Rails does not like primary keys that
are not incremental. I know I can set the primary key to
Legacy_System_ID1 in Table 1 and set the foreign key to the same ID in
Table 2.

The pinch is that I need to seperate the contact_ID from the
Legacy_System_ID2 of Table 2 into two tables and also add new entries
into Table 3, which is essentially a subset of Table 1 to keep track
of which Agencies with unique Agency_Business_Numbers are registered.

Whats the best way to go about this in Rails? I am experimenting with
Instant Rails 2.02
Daniel B. (Guest)
on 2008-11-13 05:49
(Received via mailing list)
On Nov 13, 11:10 am, Auch <removed_email_address@domain.invalid> wrote:
> Legacy_System_ID1, Agency_Business_Number, Agency_Name
> has many Table 1
> of which Agencies with unique Agency_Business_Numbers are registered.
> Whats the best way to go about this in Rails? I am experimenting with
> Instant Rails 2.02

I think your model is saying something like
 System contact (a person) "has many" Agencies
in a nutshell right?

Daniel B.
Phil (Guest)
on 2008-11-13 06:45
(Received via mailing list)
Hi Daniel

Thanks for replying so quickly. In a nutshell, yes. An Agency has many
People. Essentially the purpose of the project is to perform an
interim admin function to sync two systems. Hence there are two sets
of Primary keys and two tables. The third table is the output, where
it records the Agency business number to ensure that the Agency is
registered. Obviously there will be multiple Agency profiles for the
two systems with the primary keys for the agencies. Currently this is
being done manually.

What I want to find out now is how to generate the view to encompass
the values from all three tables into one view, when I am using one of
the two system generated lists as a list for users to determine if a
client has been registered or not. E.g

Agency ID 2 is clicked, which is linked to only one Agency Business
Number. How do I represent the values for this Agency ID 2 from the
other two tables? Obviously some Agency IDs will not have a
corresponding Agency Business Number in table 3 as they have not been
registered as yet, or in Table 2 for that matter. I am envisaging the
use of partials.

I worked out how to generate primary and foreign keys. Currently I
have some code in my model that does this, but is not the best.

Upload Model
    FasterCSV.foreach("D:/Rails/MySql/Migration/file.csv) do |row|
      unless Agency_ID1.exists?(row[0])
       agency =>row[1],:TPID=>row[3]) do
          i.Agency_ID1 = (row[0])
      unless person.exists?(row[5])
      contact =>row[6],:ContactLname=>row
       :ContactFax=>row[9],:ContactEmail=>row[10]) do |si|
         i.ContactID = (row[5])

It's meant to be interim code that helps me load primary key values.

I also have a search function working with Acts_as_ferret.

This is the model code for Agency 2 (list)

acts_as_ferret :fields => [:OrganisationName]

This is the controller

class SearchesController < ApplicationController
 def index
   if params[:q]
     query = params[:q]
     @Agency2 = Agency_ID2.find_with_ferret query, :page => params
[:page], :per_page => 50

This is the view in views/searches

        <td>smartbuy ID</td>
        <td>Supplier ABN</td>
        <td>Supplier TPID</td>
      <% @sbtradesuppliers.each do |s| %>
      <td><%= link_to s.OrganisationName, Agency2_path( %></td>
      <td><%= s.Agency Business Number%></td>
      <td><%= s.Agency ID 2%></td>
    <% end %>
<%= will_paginate @Agency2 %>

My last question is, is this restful?

Any help would be much appreciated.
Daniel B. (Guest)
on 2008-11-13 09:17
(Received via mailing list)
I can't grasp the situation but it just seems to me that if you're
migrating old data
into a new system going forward, you should probably massage it
and get it normalized and put it into the database in one hit.
The best swiss army knives I know
of are spreadsheets (and all their functions) and databases (sql and
large data sets) for sorting this sort of stuff out.
Rails isn't necessarily the best way to do it although it might help
in some situations.

Surely table 3 and table 1 should be combined, shouldn't they?
You don't want 2 tables of agencies. You just want one and you can
tell which are registered by the fact that they do or don't have a
number against them.  Merging table 3 into 1 might be the first
thing.  If registration is more complex than that, then you may have
to set up more tables and associations to model it appropriately.

Table 2 is already linked to table 1 via legacy ID1 - assuming these
id's are ok.
So I'd get table2 into the database; pull out unique list of system
contacts and create
a separate table 'system_contacts'  (I'm assuming you've got some
other fields to put against them).  Table 2 then becomes a joining
table.  It already has the two fk's -  which you might relabel as
agency_id and system_contact_id.

Once this is done, you'll have 3 tables and 3 models and using them
would be a basic rails exercise.
I probably haven't grasped the full complexity of the relationships
here, so I'll stop there.

Daniel B.
Tricon T. (Guest)
on 2008-11-13 12:39
(Received via mailing list)
So you need a join table that contains: LEGACY_SYSTEM_ID2 |
CONTACT_ID : as fields in which the two fields do NOT use the same ID?
This topic is locked and can not be replied to.