Failry simple(?) active record question

I’m plodding my way through active record right now, and running into
some things that seem odd.

Take a really simple example
#!/usr/bin/ruby
require ‘rubygems’
require ‘active_record’

ActiveRecord::Base.establish_connection(:adapter => “sqlite3”,
:database => “foo.db”)

ActiveRecord::Schema.define() do
create_table :containers do |table|
table.column :name, :string
end
create_table :things do |table|
table.column :description, :string
end
end

class Container<ActiveRecord::Base
has_many :things
end

class Thing<ActiveRecord::Base
belongs_to :container
end

Container.create(:name=>“Bucket”)
bucket=Container.find_by_name(“Bucket”)
pocket=Container.create(:name=>“Pocket”)

bucket.save
pocket.save

Container.find(:all)
#this will find both containers

Thing.find(:all)
#empty, as expected

bucket.things.create(:description=>“fish”)
pocket.things.create(:description=>“lint”)

Thing.find(:all)
#looks good…

#but howcome
pocket.things.find(:all)
#throws some huge error instead of finding the things in the pocket?

Sorry for the overly newbie type question :slight_smile: I just really thought
ActiveRecord was supposed to take care of all this stuff.

Thanks,
Kyle

On Nov 26, 9:32 pm, Kyle S. [email protected] wrote:

has_many :things
bucket.save

Thanks,
Kyle

What error do you get? That would help in diagnosing the problem.

You might also want to ask the Ruby on Rails list. I know ActiveRecord
doesn’t have to be used with Rails, but they probably have more people
there with ActiveRecord experience.

Jeremy

On Nov 26, 2007, at 19:32 , Kyle S. wrote:

I’m plodding my way through active record right now, and running into
some things that seem odd.

AR questions should go to the rails list… that’s the group that
writes and supports AR.

OK. I’ll repost it there. As I really wanna just use AR and not
rails :wink: I had hopes for this list.

Heck maybe this just means if I’m having this much trouble I should
write all my findings up as a few good examples and howto’s.

Thanks
–Kyle

Kyle S. wrote:

Take a really simple example

ActiveRecord::Schema.define() do
create_table :containers do |table|
table.column :name, :string
end
create_table :things do |table|
table.column :description, :string
end
end

#but howcome
pocket.things.find(:all)
#throws some huge error instead of finding the things in the pocket?

Kyle,

when you have a relationship ‘belongs_to’, you need to define a field
in the database table to references the parent (the name is
<parent_singular>_id), as ActiveRecord does not create this field
automatically. So, we just need a ‘container_id’ in the ‘things’ table:

ActiveRecord::Schema.define() do
create_table :containers do |table|
table.column :name, :string
end

create_table :things do |table|
table.column :description, :string
table.column :container_id, :integer # <-- here
end
end

Your example runs now fine.
You could also add an index (with ‘add_index’) for performance.

Regards

Raul