# DRb and ActiveRecord

**URL:** <https://www.ruby-forum.com/t/drb-and-activerecord/97300>\
**Category:** Ruby\
**Created:** [January 25, 2006, 5:54pm UTC](https://www.ruby-forum.com/t/drb-and-activerecord/97300 "2006-01-25T17:54:24Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![ezra\_z](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/f07891/32.png) [@ezra\_z](https://www.ruby-forum.com/u/ezra_z)\
**Post date:** [January 25, 2006, 5:54pm UTC](https://www.ruby-forum.com/t/drb-and-activerecord/97300/1 "2006-01-25T17:54:24Z")

</div>

Friends-

```
I am trying to make a drb server publish an ActiveRecord model so it

```

can be used by remote clients. It looks like I am getting close but  
no cigar. Can some kind soul enlighten me as to how to make this  
work? It seems like it is communicating with the remote AR model. And  
I am able to create records and find records. But I am unable to  
display the contents of the records on the client side. It seems like  
drb is not unmarshaling them correctly. Do I need to use DRbUndumped  
or something similar? Any help is greatly appreciated!

```
Here is my code and irb session:

```

# server.rb

#!/usr/local/bin/ruby  
require ‘rubygems’  
require ‘drb/drb’  
require\_gem ‘activerecord’

ActiveRecord::Base.establish\_connection(  
:adapter =\> “mysql”,  
:username =\> “root”,  
:host =\> “localhost”,  
:password =\> “reversal”,  
:database =\> “switchboard\_development”  
)

class RemoteRecord \< ActiveRecord::Base  
end

## DRb.start\_service(“druby://:3500”, RemoteRecord) puts DRb.uri DRb.thread.join

And my irb session trying to access the remote model.

ezra:~ ez$ irb  
irb(main):001:0\> require ‘rubygems’  
=\> true  
irb(main):002:0\> require ‘drb/drb’  
=\> true  
irb(main):003:0\> require\_gem ‘activerecord’  
=\> true  
irb(main):005:0\* DRb.start\_service  
=\> #\<DRb::DRbServer:0x137d3b0 @uri=“druby://ezra.local:61668”,  
@idconv=#DRb::DRbIdConv:0x410d88, @front=nil, @config=  
{:idconv=\>#\<DRb::DRbIdConv:  
0x410d88\>, :argc\_limit=\>256, :verbose=\>false, :tcp\_acl=\>nil, :load\_limit  
=\>26214400}, @thread=#\<Thread:0x137d324 sleep\>, @grp=#\<ThreadGroup:  
0x137d374\>, @protocol=#\<DRb::DRbTCPSocket:0x137d02c @uri=“druby://  
ezra.local:61668”, @acl=nil, @config={:idconv=\>#\<DRb::DRbIdConv:  
0x410d88\>, :argc\_limit=\>256, :verbose=\>false, :tcp\_acl=\>nil, :load\_limit  
=\>26214400}, @msg=#\<DRb::DRbMessage:0x137d004 @argc\_limit=256,  
@load\_limit=26214400\>, @socket=#TCPServer:0x137d0a4\>\>

irb(main):006:0\> test = DRbObject.new(nil, ‘druby://ezra.local:3500’)  
=\> #\<DRb::DRbObject:0x1379990 @ref=nil, @uri=“druby://ezra.local:3500”\>

irb(main):009:0\> test.create(:title =\> ‘Foo’, :desc =\> ‘Bar’)  
=\> #\<DRb::DRbUnknown:0x13727f8 @buf="\004\010o:\021RemoteRecord\010:  
\020@new\_recordF:\f@errorso:\031ActiveRecord::Errors\a;\a{\000:  
\n@base@\000:\020@attributes{\010"\ntitle"\010Foo"\aidi\010"\tdesc  
“\010Bar”, @name=“RemoteRecord”\>

irb(main):011:0\> a = test.find :first  
=\> #\<DRb::DRbUnknown:0x136dce4 @buf="\004\010o:\021RemoteRecord\006:  
\020@attributes{\010"\ntitle"\010foo"\aid"\0061"\tdesc  
“\010bar”, @name=“RemoteRecord”\>

irb(main):012:0\> p a  
#\<DRb::DRbUnknown:0x136dce4 @buf="\004\010o:\021RemoteRecord\006:  
\020@attributes{\010"\ntitle"\010foo"\aid"\0061"\tdesc  
“\010bar”, @name=“RemoteRecord”\>  
=\> nil

irb(main):013:0\> a.title  
NoMethodError: undefined method `title’ for #DRb::DRbUnknown:0x136dce4  
from (irb):13

So you can see it is almost working! title and desc are columns in  
the database table. The records do get created fine in the db and it  
seems to get the right records when I run a find on the model. I just  
can’t figure out how to use the found object like a normal active  
record. I mean I need to be able to display the attributes of the  
record after I do a find and thats the part that is not working for me.

Thoughts? Clues? Derision?

Thanks-  
-Ezra

---

<div class="post-metadata">

**Author:** ![ezra\_z](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/f07891/32.png) [@ezra\_z](https://www.ruby-forum.com/u/ezra_z)\
**Post date:** [January 25, 2006, 6:09pm UTC](https://www.ruby-forum.com/t/drb-and-activerecord/97300/2 "2006-01-25T18:09:39Z")

</div>

On 1/25/06, Ezra Z. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ```
> :username => "root",
> 
> ```
> 
> DRb.thread.join  
> irb(main):005:0\* DRb.start\_service
> 
> =\> #\<DRb::DRbUnknown:0x136dce4 @buf="\004\010o:\021RemoteRecord\006:  
> NoMethodError: undefined method `title’ for #DRb::DRbUnknown:0x136dce4  
> from (irb):13
> 
> So you can see it is almost working! title and desc are columns in  
> the database table. The records do get created fine in the db and it  
> seems to get the right records when I run a find on the model. I just  
> can’t figure out how to use the found object like a normal active  
> record. I mean I need to be able to display the attributes of the  
> record after I do a find and thats the part that is not working for me.

Just a shot in the dark: does  
a.send :title  
work?

---

<div class="post-metadata">

**Author:** ![ezra\_z](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/f07891/32.png) [@ezra\_z](https://www.ruby-forum.com/u/ezra_z)\
**Post date:** [January 25, 2006, 6:24pm UTC](https://www.ruby-forum.com/t/drb-and-activerecord/97300/3 "2006-01-25T18:24:49Z")

</div>

Ezra Z. wrote:

> Friends-

Advance warning: I am not a drb or ActiveRecord expert. I’m not much of  
an expert on anything, come to think of it 🙂

> ```
> I am trying to make a drb server publish an ActiveRecord model so 
> 
> ```
> 
> it can be used by remote clients.  
> …  
> class RemoteRecord \< ActiveRecord::Base

You need to make this class undumped:

```
  include DRb::DRbUndumped

```

> irb(main):009:0\> test.create(:title =\> ‘Foo’, :desc =\> ‘Bar’)  
> =\> #\<DRb::DRbUnknown:0x13727f8 @buf=“\004\010o:\021RemoteRecord\010:  
> \020@new\_recordF:\f@errorso:\031ActiveRecord::Errors\a;\a{\000:  
> \n@base@\000:\020@attributes{\010"\ntitle"\010Foo"\aidi\010"\tdesc  
> "\010Bar”, @name=“RemoteRecord”\>

DRbUnknown is your clue here. See:

[http://www.ruby-doc.org/stdlib/libdoc/drb/rdoc/classes/DRb/DRbUnknown.html](http://www.ruby-doc.org/stdlib/libdoc/drb/rdoc/classes/DRb/DRbUnknown.html)

> …  
> irb(main):013:0\> a.title  
> NoMethodError: undefined method `title’ for #DRb::DRbUnknown:0x136dce4  
> from (irb):13

Since “a” is a DRbUnknown object, it doesn’t have a title method; hence  
the exception. You need drb to send over a proxy for the object so you  
can send methods back to it. That’s what DRb::DRbUndumped does. After  
you make that change, “a” will be a DRb::DRbObject, and the method calls  
will be sent back to the server.

Or something like that…

---

<div class="post-metadata">

**Author:** ![ezra\_z](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/f07891/32.png) [@ezra\_z](https://www.ruby-forum.com/u/ezra_z)\
**Post date:** [January 25, 2006, 6:33pm UTC](https://www.ruby-forum.com/t/drb-and-activerecord/97300/4 "2006-01-25T18:33:54Z")

</div>

Bob-

```
Thank you very much. That was exactly what I needed and now it works

```

fine.

I appreciate it  
-Ezra
