Hi 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
on 2008-11-13 02:49
on 2008-11-13 04:49
On Nov 13, 11:10 am, Auch <philip...@commerce.nsw.gov.au> 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 Bush
on 2008-11-13 05:45
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 def self.save FasterCSV.foreach("D:/Rails/MySql/Migration/file.csv) do |row| unless Agency_ID1.exists?(row) agency = Agency.new(:OrganisationName=>row,:TPID=>row) do |i| i.Agency_ID1 = (row) end agency.save end unless person.exists?(row) contact = person.new(:ContactFname=>row,:ContactLname=>row ,:ContactPhone=>row, :ContactFax=>row,:ContactEmail=>row) do |si| i.ContactID = (row) end contact.save end end end 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 end end end This is the view in views/searches <table> <thead> <tr> <td>OrganisationName</td> <td>smartbuy ID</td> <td>Supplier ABN</td> <td>Supplier TPID</td> </tr> </thead> <tbody> <% @sbtradesuppliers.each do |s| %> <tr> <td><%= link_to s.OrganisationName, Agency2_path(s.id) %></td> <td><%= s.Agency Business Number%></td> <td><%= s.Agency ID 2%></td> </tr> <% end %> </tbody> </table> <br> <br> <br> <%= will_paginate @Agency2 %> My last question is, is this restful? Any help would be much appreciated.
on 2008-11-13 08:17
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 Bush
on 2008-11-13 11:39
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?