Polymorphic problem

Hi, I'm in the process of learning ruby on rails so this will be one of many posts by me when I can't find the solution by googling.

I have set up a polymorphic relationship that I can't get to work when storing data.

def self.up     create_table :table_labels do |t|     t.column :label_type, :string     t.column :label_id, :integer     t.column :english, :text       t.timestamps     end

    create_table :menus do |t|     t.column :name, :string, :limit=>50     t.column :parent_id, :integer     t.column :position, :integer     t.column :main, :boolean     t.column :footer, :boolean     t.column :active, :boolean     t.column :controller,:string, :limit=>50     t.column :action, :string, :limit=>50       t.timestamps     end   end

class Menus < ActiveRecord::Base   acts_as_list   acts_as_tree   has_one :table_labels, :as => :label   validates_presence_of :name, :english, :parent_id   validates_uniqueness_of :name end

class TableLabels < ActiveRecord::Base   belongs_to :label, :polymorphic => true end

def add_menu     newmenu = Menus.new(:name => params[:label][:name], :parent_id => params[:label][:parent_id])     newlabel = TableLabels.new(:english => params[:label][:english])     newlabel.label = newmenu     newlabel.save!     render :action => :list_menus end

What happens is a row is added to the table_labels but with a NULL entry for label_id and nothing is added to menus table.

What am I missing?

can anyone help?

What happens is a row is added to the table_labels but with a NULL entry for label_id and nothing is added to menus table.

Try saving the newmenu object before you assign it.

Fred

Tried that with newmenu.save and the same thing happens. however if I use newmenu.save! I get the error English can't be blank, even though it isn't

Shouldn't rails be creating a JOIN in the sql? at the moment in the trace is shows both tables being loaded seperately. I'm sure it's just me not yet understanding how table relationships work. Can any one help?

Tried that with newmenu.save and the same thing happens. however if I use newmenu.save! I get the error English can't be blank, even though it isn't

Well if there is a failing validation you need to fix it since rails
won't save it

Perhaps I need to explain how I wish this to work

I have a form on a page that adds a new menu item. the form consists of the menu name, name in english (other languages will be added later) and parent_id (from dropdown list of menu items). When you submit I want the data to be added to the database like this

Menus.name = > post.name Menus.parent_id => post.parent_id TableLabels.english => post.english TableLabels.label_id => Menus.id TableLabels.label_type => Menus

How do I write the code to achieve this?

. If I wrote it in php - sql it would look like this.

$sql1 = "INSERT INTO menus (name, parent_id) VALUES ('". $_POST['name']."',".$_POST['parent_id'].")"; $sql2 = "INSERT INTO table_labels (menu_id,menu_type,english) VALUES (".mysql_insert_id().",'menus','".$_POST['english']."')";

Anyone?

I fixed it!

The problem was so simple

I had the validation for the english field in the wrong class, it should have been in the TableLabels class and not the Menus class. works perfectly now.