Firebird News

Wednesday, October 17, 2012

Rails On Firebird - status and follow the guide

Rails On Firebird - you need to check that Firebird active record adapter and ruby driver are installed
gem install rails

rails /home/mariuz/mynewapp -D firebird
But it generated sqlite config so i had to delete all and

I have configured this way my database : first i have created in flamerobin an empty firebird db /var/lib/firebird/2.5/data/rubyonfire.fdb

Be aware about indentation
cat config/database.yml



ruby script/generate scaffold Client name:string address:string email:string remark:text
rake db:migrate


You can create the table structure by hand if you wish so

I have re-read the ruby guide
so i did these commands while following the official guide
rake db:create
but database was already created in flamerobin
script/generate controller home index
vi app/views/home/index.html.erb
and write something there, start the server with
script/server
and now you can see something in browser
http://localhost:3000/


I have created the table and one sequence in firebird db
CREATE TABLE posts (
id BIGINT NOT NULL PRIMARY KEY,
name VARCHAR(255),
title VARCHAR(255),
content VARCHAR(255),
timestamps timestamp
);
CREATE GENERATOR POSTS_SEQ;

I have ran the scaffold again to generate the posts model/view/controller
script/generate scaffold Post name:string title:string content:text
and then
started the server
script/server

of course I have modified the route and added an link as in tutorial and now i can add and modify blog posts
note: in new rails route is defined this way in config/routes.rb
map.root :controller => "home"

http://localhost:3000/posts






Follow the normal ActiveRecord conventions for table names, primary key columns, etc. The one “extra” you’ll need for Firebird is that you’ll have to create a generator for any tables that require a sequence-based primary key. The default naming convention is TABLENAME_SEQ. So if you have a users table, you would need to create a corresponding USERS_SEQ generator

You don't need to create before insert triggers ! rails reads the value from sequence and then increments it in ruby code, Yay!

6 comments:

Nielson Rolim said...

Hi Mariuz!

Great post! It's exactly what I needed.

I followed your tips, but I still got some issues.

I am using Firebird 2.5 and Rails 2.3.8. I've installed the to gems fb and fb_adapter and connected to the database successfully. But, when I tried to get an object from the database I've got the follow error:

>> p = Tbprod.first
ActiveRecord::StatementInvalid: Fb::Error: Invalid token
Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 15
"TBPROD"
: SELECT * FROM "TBPROD" ROWS 1,
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/connection_adapters/abstract_adapter.rb:221:in `log'
from /Library/Ruby/Gems/1.8/gems/fb_adapter-0.6.0/lib/active_record/connection_adapters/fb_adapter.rb:307:in `log'
from /Library/Ruby/Gems/1.8/gems/fb_adapter-0.6.0/lib/active_record/connection_adapters/fb_adapter.rb:312:in `select_all'
from /Library/Ruby/Gems/1.8/gems/fb_adapter-0.6.0/lib/active_record/connection_adapters/fb_adapter.rb:299:in `translate'
from /Library/Ruby/Gems/1.8/gems/fb_adapter-0.6.0/lib/active_record/connection_adapters/fb_adapter.rb:311:in `select_all'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:664:in `find_by_sql'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:1578:in `find_every'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:1535:in `find_initial'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:616:in `find'
from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:626:in `first'
from (irb):2


Could you help me with that?

mariuz said...

Please install fb_adapter from git

Seems that you have a version of adapter that you doesn't give the first row (ROWS feature was implemented later )

I have tested with version from git and first works
p = Post.new(:content => "A new post")
=> #
>> p.save
=> true
>> f = Post.first
=> #

mariuz said...

The output was cleaned but here is on gist

https://gist.github.com/9dbec72ab99a70dcb9fa

I also requested a new version of the gem version

mariuz said...

The message is about TBPROD

check if it works with select * from TBPROD

My guess is that is something wrong with the model/table

mariuz said...

I never use dialect 1 but
rowland found the issue
I suspect a dialect 1 database and mixed-case table names are behind the errors. A backup/restore may solve Nielson's issue.
Actually, it turns out it is gfix which is required: http://www.firebirdsql.org/manual/gfix-dialect.html

Nielson Rolim said...

Thank you!

It is working fine now =)

I changed the dialect to 3.