Self-referential habtm: why are my keys null?

I’m trying to set up a directional self-referential HABTM to represent
an arbitrary semi-hierarchical structure; it works for any data
prepopulated into the db, but when I try to create a new relationship,
I just get NULLs in both key columns (or 0’s if I turn on the no-null
constraint).

Here are the migrations:

class CreateNodes < ActiveRecord::Migration
def self.up
create_table :nodes do |t|
t.column :name, :string
end
end

def self.down
drop_table :nodes
end
end

class CreateNodesNodes < ActiveRecord::Migration
def self.up
create_table :nodes_nodes, :id => false do |t|
t.column :parent_id, :integer
t.column :child_id, :integer
end
end

def self.down
drop_table :nodes_nodes
end
end

And here is the model:

class Node < ActiveRecord::Base
has_and_belongs_to_many :parents, :foreign_key => :child_id,
:association_foreign_key
=> :parent_id,
:class_name => ‘Node’;
has_and_belongs_to_many :children, :foreign_key => :parent_id,
:association_foreign_key
=> :child_id,
:class_name => ‘Node’;
end

I’ve also tried swapping the foreign and association_foreign keys
around.

Any idea why this isn’t working? I’m using Rails 1.2.5 on MySQL, and
aside from the above code and the database.yml I haven’t touched
anything that “rails app” created.

ruby script/console
Loading development environment.

p = Node.new
=> #<Node:0xb7192348 @new_record=true, @attributes={“name”=>nil}>

p.name = ‘parent’
=> “parent”

c = Node.new
=> #<Node:0xb714a8f4 @new_record=true, @attributes={“name”=>nil}>

c.name = ‘child’
=> “child”>> p.children << c
=> [#<Node:0xb714a8f4 @new_record=true,
@attributes={“name”=>“child”}>]

p.children
=> [#<Node:0xb714a8f4 @new_record=true,
@attributes={“name”=>“child”}>]

c.parents
=> []

p.save
=> true

c.save
=> true

p.reload
=> #<Node:0xb7192348 @new_record_before_save=true, @children=nil,
@new_record=false, @attributes={“name”=>“parent”, “id”=>“1”},
@parents=nil, @errors=#<ActiveRecord::Errors:0xb71251a8 @errors={},
@base=#<Node:0xb7192348 …>>>

p.children
=> []

c.reload
=> #<Node:0xb714a8f4 @children=nil, @new_record_before_save=false,
@new_record=false, @attributes={“name”=>“child”, “id”=>“2”},
@parents=nil, @errors=#<ActiveRecord::Errors:0xb7124f64 @errors={},
@base=#<Node:0xb714a8f4 …>>>

c.parents
=> []

Aw, of all the . . . have to specify the keys in the association as
strings, not symbols.

There should maybe be some normalization going on there, since it’s
not always obvious (to me, anwyay) when symbols work and when they
don’t…