Active resource record relationships

I tried to work out an active resource example with complex
relationships between records and had not much luck so I gave up and
manipulate *_id fields myself to get around this in a somewhat cludgy
way at times. I am wondering if there are any good books with examples
on this ? I have the agile web book 2, does book 3 go into this in
greater depth ?

You might take a look at: http://guides.rubyonrails.org/

Once you get there follow the links to the different Model topics, in
particular check out:
http://guides.rubyonrails.org/association_basics.html

What I mean is active resource over a web service so that you run a
ruby script outside of rails remotely and access the active record
objects in the rails service over http as active resource provides and
still have the complex relationships, that second part I have found
tricky

Right. You might want to look at Chap 15 in "The Rails Way", Obie
Fernandez et.al., 2008. It covers XML and ActiveResource - only 27
pages but the best I've been able to find to date. I'm assuming that
what you mean by "complex relationships" is the A...Resource parallel
to associations in A...Record. If not, clue me in with more details.

I've had that book ever since it came out, and have tried to work on
this problem using the book as well.

What I seem to recall is that belongs_to, has_many, or anything
similar is not that easy to figure out how to get it to work, at least
I have not had good luck with it.
I find it easier that when the rails server calls a drb process and on
some other machine on the network and that process needs to use active
resource, I just pass an array of record id's through drb and then drb
can do rec.find(id) which works fine. Then if I have a relationship, I
just handle it manually by setting say rec.parent_id. Other types of
find() may cause the server to send over all the records for it to
search through which can be a problem if there are too many records.

This seems kludgy, but that's what I have been doing ever since I
gave up on trying to figure this out as it seemed there where not
enough good examples or those that I found I had problems getting to
work.

what's been difficult about using active record?
can you post snippets of your current code and then maybe we can
rewrite it using AR?

-Gabe

I'm not sure I understand what you're trying to accomplish but here's
instructions for a has_and_belongs_to_many example which also provides
an ActiveResource (xml) feed.

Assumptions:
        Ruby 1.8.7
        Rails 2.3.2
        sqlite3

1) run:

   rails simple_test
   cd simple_test

2) run:

   script/generate scaffold User name:string
   script/generate scaffold Like name:string
   script/generate migration LikesUsers

3) edit the models user.rb and like.rb to read:

   class User < ActiveRecord::Base
     has_and_belongs_to_many :likes
   end

   class Like < ActiveRecord::Base
     has_and_belongs_to_many :users
   end

4) edit db/migrate/*_likes_users.rb to read:

class LikesUsers < ActiveRecord::Migration
  def self.up
    create_table :likes_users, :id => false do |t|
      t.column :like_id, :integer, :null => false
      t.column :user_id, :integer, :null => false
    end
  end

  def self.down
    drop_table :likes_users
  end
end

5) edit the users and likes controllers' show methods
   to read:

  # GET /users/1
  # GET /users/1.xml
  def show
    @user = User.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml { render :xml => @user.to_xml(:include => :likes) }
    end
  end

  # GET /likes/1
  # GET /likes/1.xml
  def show
    @like = Like.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml { render :xml => @like.to_xml(:include => :users) }
    end
  end

6) run:

   rake db:migrate
   script/server

7) run:

   script/console
   Loading development environment (Rails 2.3.2)
   >> fred = User.create(:name => "Fred")
   => #<User id: 1, name: "Fred", created_at: "2009-06-24 16:13:42",
updated_at: "2009-06-24 16:13:42">
   >> fred.save
   => true
   >> fred.reload
   => #<User id: 1, name: "Fred", created_at: "2009-06-24 16:13:42",
updated_at: "2009-06-24 16:13:42">
   >> wilma = User.create(:name => "Wilma")
   >> wilma.save
   >> wilma.reload
   >> play = Like.create(:name => "playing with BamBam")
   >> play.save
   >> eat = Like.create(:name => "eating Bronto burgers")
   >> eat.save
   >> laugh = Like.create(:name => "laughing at Freds big shadow")
   >> laugh.save

8) connect your browser to: http://localhost:3000/users/1.xml
   connect your browser to: http://localhost:3000/users/2.xml
   connect your browser to: http://localhost:3000/likes/1.xml
   connect your browser to: http://localhost:3000/likes/2.xml
   connect your browser to: http://localhost:3000/likes/3.xml

What could be simpler?

If you are using active resource from another machine over a network
and you have something like this:

require 'rubygems'
require 'activeresource'

ResourceServer = 'http://mysite.com:3000'

class ChildRec < ActiveResource::Base
  self.site = ResourceServer

  #self.element_name = ''
end

class ParentRec < ActiveResource::Base
  self.site = ResourceServer

  #self.element_name = ''
end

Then it's no problem to do stuff like:

par = ParentRec.find(31)

However, if ParentRec has many child_recs

I was saying basically that stuff like using: par.child_recs - I
was having difficulty getting to work at the time I had looked into
that a few months ago.

I can easily do

child = ChildRec.new()
child.parent_rec_id = par.id