[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

failry simple(?) active record question.

Kyle Schmitt

11/27/2007 3:32:00 AM

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 :) I just really thought
ActiveRecord was supposed to take care of all this stuff.

Thanks,
Kyle

4 Answers

yermej

11/27/2007 5:16:00 AM

0

On Nov 26, 9:32 pm, Kyle Schmitt <kyleaschm...@gmail.com> wrote:
> 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 :) I just really thought
> ActiveRecord was supposed to take care of all this stuff.
>
> 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

Ryan Davis

11/27/2007 8:12:00 AM

0


On Nov 26, 2007, at 19:32 , Kyle Schmitt 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.


Kyle Schmitt

11/27/2007 2:14:00 PM

0

OK. I'll repost it there. As I really wanna just use AR and not
rails ;) 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

Raul Raul

11/28/2007 5:03:00 AM

0

Kyle Schmitt 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




--
Posted via http://www.ruby-....