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