views:

27

answers:

1

Hi,

I am not able to create database columns when i use t.string or t.number.

When i did rake db:migrate i got this

C:\Ruby\joker\chapter3>rake db:migrate
(in C:/Ruby/joker/chapter3)
==  CreateComicBooks: migrating ===============================================
-- create_table(:comic_books)
   -> 0.0630s
==  CreateComicBooks: migrated (0.0640s) ======================================

I have used the following code

class ComicBook < ActiveRecord::Base
def self.up
create_table :comic_books do |t|
t.string :title
t.string :writer
t.string :artist
t.integer :issue
t.string :publisher
t.timestamps
end
end

def self.down
    drop_table :comic_books
    end
end

I also tried with

class ComicBook < ActiveRecord::Base
def self.up
create_table :comic_books do |t|
t.column "title", :string
t.column "writer", :string
t.column "artist", :string
t.column "issue", :number
t.column "publisher", :string
t.timestamps
end
end

def self.down
# called when a migration is reversed
    drop_table :comic_books
    end
end

In the database I am getting the following output

mysql> show tables;
+-----------------------------------+
| Tables_in_comic_books_development |
+-----------------------------------+
| comic_books                       |
| schema_migrations                 |
+-----------------------------------+
2 rows in set (0.00 sec)

mysql> describe comic_books;
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| created_at | datetime | YES  |     | NULL    |                |
| updated_at | datetime | YES  |     | NULL    |                |
+------------+----------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

mysql>

Now when i am trying to create a new record i am getting this

C:\Ruby\joker\chapter3>ruby script/console
Loading development environment (Rails 2.3.8)
>> mycb = ComicBook.new
=> #<ComicBook id: nil, created_at: nil, updated_at: nil>
>> mycb.title = 'All new'
NoMethodError: undefined method `title=' for #<ComicBook id: nil, created_at: ni
l, updated_at: nil>
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record
/attribute_methods.rb:259:in `method_missing'
        from (irb):2

I think its a very small error but I just cant figure it out.

Looking forward for your help and support.

Thank You

+2  A: 

What's this line at the top of your migration? Is that just an error in your question ?

ComicBook < ActiveRecord::Base

It looks like your put the code in the model instead of in your migration!?

Look in /db/migrate folder for the file which should have something like this at the top

class CreateComicBooks < ActiveRecord::Migration

It looks like you've used a generator to create the migration (which is fine) then run a rake db:migrate and that will explain why you have the table in the db with just the id and timestamps. You probably want to to run rake db:rollback then add your fields into the def self.up part in the migration and re-migrate.

tsdbrown