Forum: Ruby on Rails Active Record Relationships

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Brenden B. (Guest)
on 2007-02-01 21:43
Hello.

I am able to get my setup working within the Rails console, but not
within Rails.

memberships
===========
id (PK)
...

dividends
=========
id (PK)
membership_id (FK)
...

Note: I originally had memberships_id, but this did not work correctly.

membership.rb
has_one :dividend

dividend.rb
belongs_to :membership

I am trying to loop through the memberships table, printing a mix of
information from this table and from the dividends table.

My console session below shows that I have the relationships setup
properly.

# ruby script/console
# >> member = Membership.find(1)
# >> member.first_name
"Michael"
#>> member.dividend.broker_name
"E-Trade"

Great, now for the portion of my view in rails that is causing the
error.

<td bgcolor="#EEEEEE"><%= membership.id %></td>
<td bgcolor="#EEEEEE"><%= membership.first_name %></td>
<td bgcolor="#EEEEEE"><%= membership.dividend.broker_name || "Not
Entered" %></td>

If I remove the third line (membership.dividend.broker_name), it will
find anything in the memberships table, but crashes if I try to display
anything from the dividend table.

The log file identifies the specific query that is causing a problem.
There is a record in the memberships table (probably quite a few) that
DO NOT have a corresponding record in the dividend table. I figured the
( || "Not Entered") would suffice, but I'm still getting a nasty
"NoMethodError".

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.broker_name

Do I have this setup correctly? Can active record handle the
relationship if corresponding rows don't exist in the child table?

Thanks for reading and any possible suggestions toward resolution.

-Brenden
Stephen B. (Guest)
on 2007-02-01 21:54
(Received via mailing list)
> Do I have this setup correctly? Can active record handle the
> relationship if corresponding rows don't exist in the child table?
You have got the relationship set up correctly.  However,
member.dividend will only return the associated dividend object if one
exists.  If one does not exist, it will return nil.  Therefore, you
get the error because you're trying to call 'broker_name' on a nil
object.

Basically, you need to add a bit more logic:

<% if membership.dividend %>
  <%= member.dividend.broker_name %>
<% else %>
  Not Entered
<% end %>

There is probably a way to make this a bit neater for your views, but
hopefully this'll help you on your way.

Steve
Brenden B. (Guest)
on 2007-02-01 22:02
> Basically, you need to add a bit more logic:
>
> <% if membership.dividend %>
>   <%= member.dividend.broker_name %>
> <% else %>
>   Not Entered
> <% end %>
>


Thanks Steve. Your suggestion worked. Much appreciated.
Rolando A. (Guest)
on 2007-02-01 22:09
Stephen B. wrote:
> There is probably a way to make this a bit neater for your views, but
> hopefully this'll help you on your way.

you could always use the "?" operator:

<%= membership.dividend ? member.dividend.broker_name : "Not Entered" %>

> Steve

regards,
Rolando.-
This topic is locked and can not be replied to.