Newbie question---

I wrote a ruby script that parses a file into key-values like so:
class Parser

table = { }
IO.foreach(‘Localizable.strings’) { |line|
if line =~ /^ \s* " (.?) " \s = \s* " (.*?) "/x
table[ $1 ] = $2
end
}
end

I want to store the key-values in different colums on my database so
that when I enter a key, it gives me the corresponding value…how
should I go about doing this? Thanks for your help.
ric

Hi Richard,

you might find
http://wiki.rubyonrails.org/rails/pages/HowToUseActiveRecordOutsideRails
an
interesting read.

I’ve done something like you did simply by requiring my activerecord
models
in my script and then for example do something like

table.each do |key, value|
MyKeyValueModel.create(:key => key, :value => value)
end

This of course isn’t as performant as using a method that uses the batch
capabilities of your rdbms but for key-value files that don’t contain
millions of pairs it might fit your needs.

Cheers,
Jan

Jan P. wrote:

Hi Richard,

you might find
http://wiki.rubyonrails.org/rails/pages/HowToUseActiveRecordOutsideRails
an
interesting read.

I’ve done something like you did simply by requiring my activerecord
models
in my script and then for example do something like

table.each do |key, value|
MyKeyValueModel.create(:key => key, :value => value)
end

This of course isn’t as performant as using a method that uses the batch
capabilities of your rdbms but for key-value files that don’t contain
millions of pairs it might fit your needs.

Cheers,
Jan

Thanks Jan,

One of my goals is to use a method with batch capabilities…do you know
any resources that I might find useful?

thanks

Hi Richard,

ok if performance is an issue for you, you might have a look at
http://thread.gmane.org/gmane.comp.lang.ruby.rails/14131/focus=14216

Essentialy you might
a. rely on ActiveRecord and use transactions to bundle your inserts and
commit them after a while
b. Create mysqldump like extended inserts and perform them through a
direct
connection to your database if you are on mysql

Regardless what you’re doing: Make sure to do some benchmarks and tweak
things like my.cnf. Switching auto commit makes a great deal especially
on
innodb. If you are no expert in the administration of databases you
might
have a hard time in tweaking performance until it fits your needs. At
least
I had for an issue like yours quite some time ago. But I haven’t got
numbers
or wiki-entries from this task anymore…

Cheers,
Jan

Hi, Richard,

no problem. If you got some time we’ll rule things out.

First thing: What is your development.log telling you. Are things
working so
far? You might post the output…
Second:
Maybe its just a typo but if you copy&pasted the code then there are at
least three things:

  • it’s got to be table.each do
  • create is IMHO a class method so you should write StringRecord.create
  • in your each loop you extract key and value as variables from the
    table
    hash. So it’s not $1 and $2 but key and value. The whole line:
    StringRecord.create(:key => key, :value => value)

Cheers,
Jan

Jan P. wrote:

Hi Richard,

ok if performance is an issue for you, you might have a look at
http://thread.gmane.org/gmane.comp.lang.ruby.rails/14131/focus=14216

Essentialy you might
a. rely on ActiveRecord and use transactions to bundle your inserts and
commit them after a while
b. Create mysqldump like extended inserts and perform them through a
direct
connection to your database if you are on mysql

Regardless what you’re doing: Make sure to do some benchmarks and tweak
things like my.cnf. Switching auto commit makes a great deal especially
on
innodb. If you are no expert in the administration of databases you
might
have a hard time in tweaking performance until it fits your needs. At
least
I had for an issue like yours quite some time ago. But I haven’t got
numbers
or wiki-entries from this task anymore…

Cheers,
Jan

Thanks Jan,

I tried what you told me and it still didn’t work. I’m not sure if i’m
doing something wrong (most likely since I’m new with ruby on rails and
I seem to be quite confuse). this is what I wrote down below. I asked
someone else too about it but they mentioned I could simply put my ruby
script on the model lib. This is what i did. I was hoping if you had a
chance you could guide me in the right direction. thank you so much
jan!!!

my view:

Importing Strings

<%=error_messages_for("string_record")%> <%= start_form_tag({:action => 'save'}, :multipart => true)%>

Lenguage:
<%= select("variable", nil, @array_of_lenguages) %>

Path:
<%= file_field ("string_record", "import_strings" )%>

<%= submit_tag "Import"%>

<%= end_form_tag%>

my save method in my controller:
def save
@string_record = StringRecord.new(params[:string_record])
if @string_record.save
redirect_to(:action=>‘show’, :id =>@string_record.id)
else
render(:action=>:get)
end
end

this is my active record class:
class StringRecord < ActiveRecord::Base

def import_strings
table = { }
IO.foreach(‘Localizable.strings’) { |line|
if line =~ /^ \s* " (.?) " \s = \s* " (.*?) "/x
table[ $1 ] = $2
end

table.eabh do |key, value|
string_record.create(:key => $1, :value => $2)
end
}

end
end

rich

Jan P. wrote:

Hi, Richard,

no problem. If you got some time we’ll rule things out.

First thing: What is your development.log telling you. Are things
working so
far? You might post the output…
Second:
Maybe its just a typo but if you copy&pasted the code then there are at
least three things:

  • it’s got to be table.each do
  • create is IMHO a class method so you should write StringRecord.create
  • in your each loop you extract key and value as variables from the
    table
    hash. So it’s not $1 and $2 but key and value. The whole line:
    StringRecord.create(:key => key, :value => value)

Cheers,
Jan

Hi Jan,

I fixed the typos and I get this error from my browser:
Mysql::Error: #23000Column ‘date_imported’ cannot be null: INSERT INTO
string_records (platform, date_imported, context_of_string,
identifier, lenguage, string) VALUES(’’, NULL, ‘’, 0, ‘’, ‘’)

I think this is becasue I’m only uploading into two fields but my table
has seven fields…nonetheless do you think I can upload only to two
columns? Or do I need to create special table with only two fields?

thanks again

Hi Mike,

What do you want to model with the date_imported column? If it is a
import-date that you already have in your key-value file, then why don’t
you
set it? If you just want to have a timestamp on your table when
something
has been imported and updated then you might want to use the rails
convention and use datetime fields named ‘created_at’ and ‘updated_at’,
then
rails will make the hard work and fill in the appropriate values for
you.

Finally: If date_imported should only on a few values be NULL you might
want
to change your schema. Seems as right now date_imported is stated as
‘NOT
NULL’, change that to DEFAULT NULL and ActiveRecord / MySQL shouldn’t
complain about the NULL value. You’ll find the exact syntax on the
documentation of mysql.com

Cheers,
Jan

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs