# Associations Confusion

**URL:** <https://www.ruby-forum.com/t/associations-confusion/82248>\
**Category:** Rails\
**Created:** [January 18, 2007, 2:59pm UTC](https://www.ruby-forum.com/t/associations-confusion/82248 "2007-01-18T14:59:26Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![mr\_brownstone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mr\_brownstone](https://www.ruby-forum.com/u/mr_brownstone)\
**Post date:** [January 18, 2007, 2:59pm UTC](https://www.ruby-forum.com/t/associations-confusion/82248/1 "2007-01-18T14:59:26Z")

</div>

Guys,very well:

## I have the table Empresas:

## id: int (…)

## and table Usuarios:

## id: int empresa\_id: int (…)

## In models, I makining the follow:

1. class Empresa \< ActiveRecord::Base
2. has\_many :usuario

* * *

1. class Usuario \< ActiveRecord::Base
2. belongs\_to :empresa

* * *

## In partial form, I makeing thus:

\<% form\_for :empresa, @empresa, :url =\> {:action =\> ‘create’} do |emp|  
%\>

(…)

```
<% fields_for :usuario, @empresa.usuario do |usr|%>
<table>
  <tr>
    <td>Nome:</td>
    <td><%= usr.text_field :nome %></td>
  </tr>

```

## (…)

## That return the follow error:

## undefined method `nome’ for Usuario:Class

## However, if I to invert the associations in models, for example:

1. class Empresa \< ActiveRecord::Base
2. belongs\_to:usuario

* * *

1. class Usuario \< ActiveRecord::Base
2. has\_many :empresa

* * *

In this way it functioned correct, now my question. I have a “empresa”  
with many “usuarios”(has\_many ok?), and many “usuario” belogs of one  
“empresa”(belongs\_to ok?). Why the logic it is contrary? Or I make a  
mistake?

And more, want I save “empresa”, not save “usuario”, only “empresas”!!!  
:[

| RazÃ£o social: | \<%= emp.text\_field :razao\_social %\> |

---

<div class="post-metadata">

**Author:** ![mr\_brownstone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mr\_brownstone](https://www.ruby-forum.com/u/mr_brownstone)\
**Post date:** [January 18, 2007, 3:51pm UTC](https://www.ruby-forum.com/t/associations-confusion/82248/2 "2007-01-18T15:51:58Z")

</div>

up

---

<div class="post-metadata">

**Author:** ![mr\_brownstone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mr\_brownstone](https://www.ruby-forum.com/u/mr_brownstone)\
**Post date:** [January 18, 2007, 4:47pm UTC](https://www.ruby-forum.com/t/associations-confusion/82248/3 "2007-01-18T16:47:16Z")

</div>

Doing @emresa.usiario doesn’t work for new records, I think.

Try doing @usiario = @emresa.usiario.new, and \<% fields\_for :usuario,  
@usuario do |usr|%\>.

Not sure, though, but try it.

On Jan 18, 3:51 pm, Marcelo J. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![mr\_brownstone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mr\_brownstone](https://www.ruby-forum.com/u/mr_brownstone)\
**Post date:** [January 18, 2007, 4:57pm UTC](https://www.ruby-forum.com/t/associations-confusion/82248/4 "2007-01-18T16:57:28Z")

</div>

removed\_email\_address@domain.invalid wrote:

> Doing @emresa.usiario doesn’t work for new records, I think.
> 
> Try doing @usiario = @emresa.usiario.new, and \<% fields\_for :usuario,  
> @usuario do |usr|%\>.
> 
> Not sure, though, but try it.
> 
> On Jan 18, 3:51 pm, Marcelo J. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

Well, I make:

(…)  
@empresa = Empresa.new(params[:empresa])  
@usuario = @empresa.usuario.new  
if @empresa.save and @usuario.save  
(…)

and  
(…)  
\<% fields\_for :usuario, @usuario do |usr|%\>  
(…)

But appear the follow message when save:  
undefined method `usuario’ for #Empresa:0x6705aac

Why?

---

<div class="post-metadata">

**Author:** ![mr\_brownstone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mr\_brownstone](https://www.ruby-forum.com/u/mr_brownstone)\
**Post date:** [January 18, 2007, 5:03pm UTC](https://www.ruby-forum.com/t/associations-confusion/82248/5 "2007-01-18T17:03:19Z")

</div>

Forgot it was a has\_many, go @usiario = @empresa.usiarios.new (plural  
of usiario)

On Jan 18, 4:57 pm, Marcelo J. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![mr\_brownstone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mr\_brownstone](https://www.ruby-forum.com/u/mr_brownstone)\
**Post date:** [January 18, 2007, 5:15pm UTC](https://www.ruby-forum.com/t/associations-confusion/82248/6 "2007-01-18T17:15:08Z")

</div>

removed\_email\_address@domain.invalid wrote:

> Forgot it was a has\_many, go @usiario = @empresa.usiarios.new (plural  
> of usiario)
> 
> On Jan 18, 4:57 pm, Marcelo J. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

Well, now save only “empresa”, but not “usuario”.

I make action thus:

def create  
@empresa = Empresa.new(params[:empresa])  
@usuario = @empresa.usuarios.new  
if @empresa.save and @usuario.save  
rendirect\_to :controller =\> ‘login’, :action =\> ‘index’  
else  
render :action =\> ‘new’  
end  
end

???

---

<div class="post-metadata">

**Author:** ![mr\_brownstone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mr\_brownstone](https://www.ruby-forum.com/u/mr_brownstone)\
**Post date:** [January 18, 2007, 5:32pm UTC](https://www.ruby-forum.com/t/associations-confusion/82248/7 "2007-01-18T17:32:36Z")

</div>

Marcelo J. wrote:

> removed\_email\_address@domain.invalid wrote:
> 
> > Forgot it was a has\_many, go @usiario = @empresa.usiarios.new (plural  
> > of usiario)
> > 
> > On Jan 18, 4:57 pm, Marcelo J. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
> 
> Well, now save only “empresa”, but not “usuario”.
> 
> I make action thus:
> 
> def create  
> @empresa = Empresa.new(params[:empresa])  
> @usuario = @empresa.usuarios.new  
> if @empresa.save and @usuario.save  
> rendirect\_to :controller =\> ‘login’, :action =\> ‘index’  
> else  
> render :action =\> ‘new’  
> end  
> end
> 
> ???

it forgives me!!! Not was saving because of “validates”. The “empresa”  
and “usuario” now they are saving, but de field “empresa\_id” of  
“usuario” it is null. How make for save empresa id? @usuario.empresa\_id  
= @empresa.id? Not have make this using only associations?

---

<div class="post-metadata">

**Author:** ![mr\_brownstone](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/59ef9b/32.png) [@mr\_brownstone](https://www.ruby-forum.com/u/mr_brownstone)\
**Post date:** [January 23, 2007, 11:35am UTC](https://www.ruby-forum.com/t/associations-confusion/82248/8 "2007-01-23T11:35:47Z")

</div>

Hi Marcelo.

You should be using the build method provided by has\_many instead of  
new. That way the usuario-empresa relationship is created (the  
empresa\_id is assigned). Using new just creates a new usuario. The line  
should look like this

@usuario = @empresa.usuarios.build

If you want to fill the usuario with the form data you could do

@usuario = @empresa.usuarios.build(params[:usuario])

In any case, using the build method will make AR save the usuario when  
you save the empresa, so there will be no need to do usuario.save

Regards

Marcelo J.  
escribió:\>

> > ???
> 
> it forgives me!!! Not was saving because of “validates”. The “empresa”  
> and “usuario” now they are saving, but de field “empresa\_id” of  
> “usuario” it is null. How make for save empresa id? @usuario.empresa\_id  
> = @empresa.id? Not have make this using only associations?

–  
Andrés Cirugeda E.  
ASPgems  
Email: andres at aspgems dot com

‘All we have to decide is what to do with the time that is given to us’.  
Gandalf.
