Rails and Databases

Hello,

I am new to RoR and have several questions.

  1. I have an existing DB and I want to develop an application that uses this existing DB. How do I import this DB into my application. What I mean is, I dont want to generate new models using rails, I want to use the existing DB.

  2. My DB contains tables named abc_profile, abc_friends and abc_register. One profile can have many friends and one profile can have one register. What I have done is, I used the generate model script to generate the 3 models, and in the AbcProfile class, I wrote has_many :abc_friends and also wrote has_one :abc_register. In the AbcFriends class I wrote belongs_to :abc_profile, and in the AbcRegister class I also wrote belongs_to :abc_profile. Then I made a profile controller (generate controller Profile) and wrote in it @result = AbcProfile.find(:all).

In the app/views/profile/index.rhtml file, I wrote <% @result.each do |res| %>, but this line is giving an error. The error is

NoMethodError in

Profile#index
Showing profile/index.rhtml where line #1 raised:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

Extracted source (around line #1):

1: <% @result.each do |res| %>
2: <table width="100%" border="0" cellspacing="0" cellpadding="0">
3: <tr>
4: <td valign="top">

Please help me with this error, and also guide me if I have done anything wrong in the above mentioned code. Also tell me about the table names and about the underscore in the table names, I mean do I write has_many :abc_profile, or do I write has_many :AbcProfile.

Any help will be highly appreciated

Please reply to the email address harisgulzar@gmail.com

Hello,

Hello,

I am new to RoR and have several questions.

1) I have an existing DB and I want to develop an application that uses
this existing DB. How do I import this DB into my application. What I mean
is, I dont want to generate new models using rails, I want to use the
existing DB.

If not set somewhere, models are more or less generated on the fly from your
tables.

2) My DB contains tables named abc_profile, abc_friends and abc_register.
One profile can have many friends and one profile can have one register.
What I have done is, I used the generate model script to generate the 3
models, and in the AbcProfile class, I wrote has_many :abc_friends and also
wrote has_one :abc_register. In the AbcFriends class I wrote belongs_to

If not set elsehwere, table-names ought to be plural. Have you set this
according to your needs?

:abc_profile, and in the AbcRegister class I also wrote belongs_to
:abc_profile. Then I made a profile controller (generate controller
: Profile)

and wrote in it @result = AbcProfile.find(:all).

In the app/views/profile/index.rhtml file, I wrote <% @result.each do |res|
%>, but this line is giving an error. The error is

NoMethodError in Profile#index

Seems your controller's index-Method is not found - it's hard to say what went
wrong, if you don't show your controller completely (pastie.caboo.se is your
friend)

Showing *profile/index.rhtml* where line *#1* raised:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

Extracted source (around line *#1*):

1: <% @result.each do |res| %>
2: <table width="100%" border="0" cellspacing="0" cellpadding="0">
3: <tr>
4: <td valign="top">

@results is nil (in Java Terms null) 'cause it hasn't been definied, 'cause
your controller wasn't executed.

Keep smiling
yanosz

thanx for your instant reply. Lemme send the code to you

I have only one controller file named “profile_controller.rb”, and it contains

class ProfileController < ApplicationController
@result = MhpProfile.find(:all)
end

I have 3 Models

“mhp_friends.rb”, “mhp_profile.rb”, “mhp_register.rb”

class MhpFriends < ActiveRecord::Base
belongs_to :MhpProfile
def self.table_name() “mhp_friends” end
end

class MhpProfile < ActiveRecord::Base
has_many :MhpFriends
has_one :MhpRegister
def self.table_name() “mhp_profile” end
end

class MhpRegister < ActiveRecord::Base
belongs_to :MhpProfile
def self.table_name() “mhp_register” end
end

I hope this helps. I have only one view under app/views/profile/index.rhtml, and the first line it has is

<% @result.each do |res| %>

which gives an error.

Please help

Hello,

thanx for your instant reply. Lemme send the code to you

I have only one controller file named "profile_controller.rb", and it
contains

class ProfileController < ApplicationController
  @result = MhpProfile.find(:all)
end

ah, here we go:

controllers need methods for the actions they provide:
Here:

class ProfileController < ApplicationController
  def index
    @result = MhpProfile.find(:all)
  end
end

I guess you should get yourself some kind of docs (books, howtos, etc)

Keep smiling
yanosz

1) I have an existing DB and I want to develop an application that uses
this existing DB. How do I import this DB into my application. What I
mean is, I dont want to generate new models using rails, I want to use
the existing DB.

here's an example db which has been created by RoR:

thufir@arrakis ~/Desktop/strawr/db $
thufir@arrakis ~/Desktop/strawr/db $ sqlite3 development.sqlite3
SQLite version 3.4.1
Enter ".help" for instructions

.schema

CREATE TABLE colors ("id" INTEGER PRIMARY KEY NOT NULL, "feed_id" integer
DEFAULT NULL, "tag_id" integer DEFAULT NULL, "color" varchar(255) DEFAULT
NULL);
CREATE TABLE feeds ("id" INTEGER PRIMARY KEY NOT NULL, "feed" varchar
(255) DEFAULT NULL);
CREATE TABLE schema_info (version integer);
CREATE TABLE tags ("id" INTEGER PRIMARY KEY NOT NULL, "tag" varchar(255)
DEFAULT NULL);

.quit

thufir@arrakis ~/Desktop/strawr/db $

What does your schema look like? Probably you need to look into a
getting RoR to work with a legacy db, which is a hassle (at least for me).

I don't advise it until you've written at least one RoR app from the
ground up.

-Thufir

Thanx a lot Jan and Thufir for your help. But now Im getting another error (and a weird one too). The page doesnt display anything, but the server console says

ERROR Errno::ENOBUFS: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.

Any insight into this error ??

Hello,