On Sun, Sep 13, 2009 at 6:41 PM, pepe <[email protected]> wrote:

> I have 2 classes:
>
> class User
>  has_many :audits
>  ...
> end
>
> class Audit
>  belongs_to :user
>  ...
> end
>
> The way things need to work is to first create an audit and after the
> audit is created a user that has access to the audit gets created.
> This has to work this way and not the other way around.
>
> I have been testing my code in the console with the following:
>
> audit = Audit.create(...)
> audit.create_user(...)
>
> In all instances 'audit' ended up being updated correctly with the
> user ID.
>
> However, when I executed a very similar code in my controller I got
> different results.
>
> My original control code:
> �...@audit = Audit.new(params[:audit])
>  ...
>  if @audit.save
>   �[email protected]_user(...)
>    unless @audit.tenant_id

Why tenant_id and not user_id?  I'm assuming that this is a typo or
you've changed your code to 'protect the innocent' and missed a
change.

I'll assume you meant user_id when you typed tenant_id.

>      # this code is never hit
>    end
>  end
>
> Everything seems OK since the @audit.tenant_id seemed to have a value
> but when the code was done running the database showed that the user
> was created but the audit never got updated with the user ID. In order
> to make it work I had to modify the code above as:

Okay, let's think about what those associations mean.

class User
    has_many :audits
    # means that we can find the audits for the user by finding all of
the rows in the audit table which have the key for this
    # User
    # There's no column for this association in the user table itself

class Audit
    belongs_to :user
    # This means that the audit table has a column, conventionally
called user_id which holds the key of the user which
    # 'has' this audit, or equivalently to which this audit belongs.
>
>  @audit = Audit.new(params[:audit])

   This creates a new Audit, which has the attribute values provided
by params[:audit].  Presumably this doesn't include a user_id value,
so the new instance of audit will have a nil value for user_id, so
>  ...
>  if @audit.save

  This saves the newly created audit in the db, and since user_id is
nil then the column value for user_id will be null
>   �[email protected]_user(...)

This creates a new user and saves it which assigns an id for the user,
it sets the user_id value in the instance of Audit, but DOES NOT SAVE
it.
>   �[email protected]     # <------- Why do I need to do this?
>    unless @audit.tenant_id
>      # this code is never hit
>    end
>  end

It's rare that you create a model with a has_many attribute from the
model which belongs_to it, it's normally done the other way around.
For one thing since a User has many audits, you don't normally create
a user each time you create an audit.

You would normally create and audit FOR a user rather than the other
way around either by:

    user = User.find(user_id)   #where user id came from an action
parameter, or a form value

  then either

    audit.create(:user => user, ....)

or

    user.audits.create(audit_parameters)

-- 
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to