create dynamic model and store the values to table

82 views
Skip to first unread message

Daynthan Kabilan

unread,
Jan 4, 2017, 9:57:54 AM1/4/17
to rubyonra...@googlegroups.com
Hi,

I have a CSV upload option and need to create a table and model based on the CSV colums.

We allow to upload different kind of CSV file formats and each file upload will create new table and info will be stored accordingly. I have created a table with columns based on CSV file header and also created a model base on CSV file name.  But when i store the file details to specific table i faced error. 


def self.import(file, head, csvalue,fname)

...............
..............

ActiveRecord::Schema.define do
      create_table "#{fname}" do |t|
        #(define your columns just as you would in a migration file)
        head.each do |h|
          t.text h
        end
        # t.string :my_string
      end
    end

  model_file = File.join("app", "models", fname.singularize+".rb")
    model_name = fname.singularize.capitalize
    File.open(model_file, "w+") do |f|
      f << "class #{model_name} < ActiveRecord::Base\nend"
    end

        # ss=model_name.new
    p   ss=model_name.constantize.new

..............
...............

file="#{fname}_#{cnt}"
return file
end


How can declare the object for dynamic model. Because I couldn't store the values to new table.

I faced the Error like NameError (uninitialized constant Mytest):

Any idea how to solve this ? 

tamouse pontiki

unread,
Jan 4, 2017, 11:37:51 AM1/4/17
to rubyonra...@googlegroups.com
I do not know if this will work, but you probably need to manually require the model file you create before you try to constantize the model name. I don't think Rails autoloading is working in this situation.

 
 

Daynthan Kabilan

unread,
Jan 5, 2017, 3:40:38 AM1/5/17
to rubyonra...@googlegroups.com
Hi Tamosus pontik,

Thanks for your reply.
The model file is created dynamically based on this code.

 model_file = File.join("app", "models", fname.singularize+".rb")
    model_name = fname.singularize.capitalize
    File.open(model_file, "w+") do |f|
      f << "class #{model_name} < ActiveRecord::Base\nend"
    end

But i need to store the values to specific tables. 
Note: I am not running migration for the dynamic tables(model)

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/CAHUC_t9d3gqinFY2hSMDMm8-Z49cQy7cRp4J8Nwgf3mAm4gccg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

tamouse pontiki

unread,
Jan 5, 2017, 8:55:29 AM1/5/17
to rubyonra...@googlegroups.com
On Thu, Jan 5, 2017 at 2:40 AM Daynthan Kabilan <dayan...@gmail.com> wrote:
Hi Tamosus pontik,

Thanks for your reply.
The model file is created dynamically based on this code.

And after you write that file, you need to require it for Rails to use it. That's why the constant is undefined.
 
Do you know how the require statement works in Ruby?

To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-ta...@googlegroups.com.
To post to this group, send email to rubyonra...@googlegroups.com.
--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-ta...@googlegroups.com.
To post to this group, send email to rubyonra...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/CADKeJyQKcRGM%3Dj3miANP9PqfODZ6fA8x98F8vUfG_QQ1KnEntw%40mail.gmail.com.

Daynthan Kabilan

unread,
Jan 6, 2017, 8:45:29 AM1/6/17
to rubyonra...@googlegroups.com
Thank you Tamosus pontik.

I have done the task using this keyword require "#{dynamic_model_name}"

To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/CAHUC_t8QDyZZhv0Z4TANe1Zc7jcR%2BqYsW4iitPxLQz%3DGqXMpKw%40mail.gmail.com.

parzival wade

unread,
Jan 15, 2017, 3:21:54 AM1/15/17
to Ruby on Rails: Talk
Hi Daynthan,

I have the same problem. So I see you got working solution.
Please, can you post final version of working important files?
Thank you.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-ta...@googlegroups.com.
To post to this group, send email to rubyonra...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-ta...@googlegroups.com.
To post to this group, send email to rubyonra...@googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-ta...@googlegroups.com.
To post to this group, send email to rubyonra...@googlegroups.com.

David Williams

unread,
Jan 19, 2017, 11:59:48 AM1/19/17
to Ruby on Rails: Talk
vocabularies = File.read(Rails.root.join('lib', 'seeds', 'words.csv'))
csv = CSV.parse(vocabularies, :headers => true, :encoding => 'ISO-8859-1')
csv.each do |row|
t = Vocabulary.new
t.
word_column1 = row[0]
t.word_column2 = row[1]
t.word_column3 = row[2]
t.word_column4 = row[3]
t.word_column5 = row[4]
t.save!
puts
"#{t.word_column1}, #{t.word_column2} saved"
end

David Williams

unread,
Jan 19, 2017, 12:00:24 PM1/19/17
to Ruby on Rails: Talk
This is for your seed file. You can create a task for it as well.

parzival wade

unread,
Jan 22, 2017, 1:03:01 PM1/22/17
to Ruby on Rails: Talk
Thank you David
Reply all
Reply to author
Forward
0 new messages