problem with complex function to save in db

hello there, i have a problem. i have my own complicated way that i want(must) save in the db i have a form for some table ("factions" in my cans, each field in the form goes to a single row of the "faction_contents" table, and then the id of that row goes to the table "factions" in the row of which the form field is for.

its a complicated thing and ugly, i know, but i don't want suggestions to not do it, i simply want you to see what i did wrong with my function and help me fix it.

this is my function:   def save_id(arguments, tables)     arguments_id = arguments     arguments.each_pair do |key, value|       pair = { :english => value}       tables["content"].new.save(pair)       content_id = tables["content"].find(:first, :order => "id DESC").id      # @pair2 = {key => @text_id}       arguments_id[key] = content_id     end       tables["table"].new.save(arguments_id)   end

the arguments are the parameters i get from the form the tables variable holds the models i use and looks like this: TABLES = {"table" => Faction, "content" => FactionContent}

the problem is when I do call this function it doesn't put any content in the db, it makes rows that their fields are NULL.

now people. i once again tell because it's important. I know it's and I know there must be a simpler and easier way, but please just help me fix this function and don't suggest other ways. TY

TEREN wrote:

this is my function:   def save_id(arguments, tables)     arguments_id = arguments     arguments.each_pair do |key, value|       pair = { :english => value}       tables["content"].new.save(pair)       content_id = tables["content"].find(:first, :order => "id DESC").id      # @pair2 = {key => @text_id}       arguments_id[key] = content_id     end       tables["table"].new.save(arguments_id)   end

the arguments are the parameters i get from the form the tables variable holds the models i use and looks like this: TABLES = {"table" => Faction, "content" => FactionContent}

Well... can you show us what an actual POST looks like from your log? It would help to see the contents of the actual params hash.

sorry but I’m kinda new with rails, i don’t know how to get a log of the hash itself. how do I do that?

Almog Friedman wrote:

sorry but I'm kinda new with rails, i don't know how to get a log of the hash itself. how do I do that?

development.log should be in a folder like:

C:\rails\appname\log\development.log

or

home\druid\rails\appname\log\development.log in a *nix envt.

heres the log hope it’ll help:

Processing FactionsController#index (for 127.0.0.1 at 2010-09-23 16:03:25) [GET]

SQL (0.1ms) SET NAMES ‘utf8’

SQL (0.1ms) SET SQL_AUTO_IS_NULL=0

Faction Load (0.4ms) SELECT * FROM factions

Rendering template within layouts/factions

Rendering factions/index

Faction Columns (0.8ms) SHOW FIELDS FROM factions

Completed in 89ms (View: 83, DB: 1) | 200 OK [http://localhost/factions]

Processing FactionsController#new (for 127.0.0.1 at 2010-09-23 21:46:35) [GET]

SQL (0.1ms) SET NAMES ‘utf8’

SQL (0.1ms) SET SQL_AUTO_IS_NULL=0

Faction Columns (0.8ms) SHOW FIELDS FROM factions

Rendering template within layouts/factions

Rendering factions/new

Completed in 43ms (View: 38, DB: 1) | 200 OK [http://localhost/factions/new]

Processing FactionsController#create (for 127.0.0.1 at 2010-09-23 21:46:39) [POST]

Parameters: {“commit”=>“Create”, “authenticity_token”=>“1f1aa67b947f0e23dc19aad8debc1e63b6df002c”, “faction”=>{“name”=>“asdasd”, “name_plural”=>“asdasd”, “description”=>“asdasdasd”}}

SQL (0.1ms) SET NAMES ‘utf8’

SQL (0.1ms) SET SQL_AUTO_IS_NULL=0

Faction Columns (0.9ms) SHOW FIELDS FROM factions

FactionContent Columns (0.7ms) SHOW FIELDS FROM faction_contents

SQL (0.1ms) BEGIN

FactionContent Create (7.4ms) INSERT INTO faction_contents (created_at, updated_at, english) VALUES(‘2010-09-23 19:46:39’, ‘2010-09-23 19:46:39’, NULL)

SQL (29.0ms) COMMIT

FactionContent Load (0.3ms) SELECT * FROM faction_contents ORDER BY id DESC LIMIT 1

SQL (0.0ms) BEGIN

FactionContent Create (0.2ms) INSERT INTO faction_contents (created_at, updated_at, english) VALUES(‘2010-09-23 19:46:39’, ‘2010-09-23 19:46:39’, NULL)

SQL (31.1ms) COMMIT

FactionContent Load (0.2ms) SELECT * FROM faction_contents ORDER BY id DESC LIMIT 1

SQL (0.0ms) BEGIN

FactionContent Create (0.1ms) INSERT INTO faction_contents (created_at, updated_at, english) VALUES(‘2010-09-23 19:46:39’, ‘2010-09-23 19:46:39’, NULL)

SQL (31.3ms) COMMIT

FactionContent Load (0.2ms) SELECT * FROM faction_contents ORDER BY id DESC LIMIT 1

SQL (0.1ms) BEGIN

Faction Create (0.2ms) INSERT INTO factions (name, created_at, updated_at, name_plural, description) VALUES(NULL, ‘2010-09-23 19:46:39’, ‘2010-09-23 19:46:39’, NULL, NULL)

SQL (29.8ms) COMMIT

Redirected to actionindex

Completed in 147ms (DB: 132) | 302 Found [http://localhost/factions]

Processing FactionsController#index (for 127.0.0.1 at 2010-09-23 21:46:39) [GET]

SQL (0.1ms) SET NAMES ‘utf8’

SQL (0.1ms) SET SQL_AUTO_IS_NULL=0

Faction Load (0.6ms) SELECT * FROM factions

Rendering template within layouts/factions

Rendering factions/index

Faction Columns (0.9ms) SHOW FIELDS FROM factions

Completed in 85ms (View: 80, DB: 2) | 200 OK [http://localhost/factions]

any help?

Almog Friedman wrote:

heres the log hope it'll help:

Processing FactionsController#create (for 127.0.0.1 at 2010-09-23 21:46:39) [POST]   Parameters: {"commit"=>"Create", "authenticity_token"=>"1f1aa67b947f0e23dc19aad8debc1e63b6df002c", "faction"=>{"name"=>"asdasd", "name_plural"=>"asdasd", "description"=>"asdasdasd"}}

FactionContent Create (7.4ms) INSERT INTO `faction_contents` (`created_at`, `updated_at`, `english`) VALUES('2010-09-23 19:46:39', '2010-09-23 19:46:39', NULL)

no values for 'english' in any of the inserts

I think you're over-complicating things...

In factions_controller.rb:

def create   # just grab the hash for the model being saved   hash = params[:faction]   # do the string to content record id magic   hashnew = save_ids(hash)   # save a new Faction record   Faction.create(hashnew)   # find the one just saved   @faction = Faction.find(:last, :order => 'id') end

And wherever you have this stored:

def save_ids(arguments)   # saving the content is table agnostic, don't need that parameter

  # new empty hash to return   ret = Hash.new   # for the incoming arguments hash   arguments.each_pair { |key,value|     # store each value in Contents     Content.create(:english => value)     # find the record just written     content = Content.find(:last, :order => 'id')     # replace the string just stored with a stringified id from Contents     ret[key] = content.id.to_s   }   # return our new hash   return ret end

worked for me...

Hmm... maybe you do need a table name involved:

Controller:

def create   hash = params[:faction]   hashnew = save_ids(hash, 'FactionContent')   Faction.create(hashnew)   @faction = Faction.find(:last, :order => 'id') end

And that other routine:

def save_ids(arguments, table)   ret = Hash.new   arguments.each_pair {|key, value|     table.constantize.create(:english => value)     content = table.constantize.find(:last, :order => 'id')     ret[key] = content.id.to_s   }   return ret end

ok, i think this should work ty very much. i really appreciate it. but I have one question, I didn’t quite understand why did you put that: @faction = Faction.find(:last, :order => ‘id’) at the end of the controller action.

Almog Friedman wrote:

I didn't quite understand why did you put that: @faction = Faction.find(:last, :order => 'id') at the end of the controller action.

In the code I posted, there is no @faction object populated from the params, and standard routing after a create is to go to the show for that @faction (the usual respond_to do |format| block).

Faction.create doesn't create one either, so I retrieved the one just created.

yea mannered to figure it out eventually. well again i wanna thank you, it worked(with slight modifications to fit right) thank you so very much. I’ve been trying to make this function work for over a week and you solved it less than a day.