[Nitro] The has_one/belongs_to relationship

Jonathan Buch john at oxyliquit.de
Sun Aug 19 14:42:10 EDT 2007


Hi,

> Is Character#account_oid not saved until I call Account#update? I can't say
> for sure, but I think the field was NULL in the db after Character#create,
> but was then set in the db after Account#update. Just trying to clarify how
> this works.

Ah, no, nothing gets 'autosaved' just by setting something (would be quite
inefficient, saving 10 values in a row would mean 10 queries, unacceptable).
By doing a .save or .update you then send changes to the DB.

> I may have misspoken -- what I meant is that the has_many objects were loaded
> and attached when I loaded the object they belong to. The Character object is
> now also loading and attaching when I load the corresponding Account object.
> I'm assuming, from what you said, that this loading and attachment happens
> during Og#allocate?

Ah yes, 'loaded and attached', that'd be a good description on what it does.  :)

On the internals... well, that always depends on how the object is loaded.

`MyModel[oid]` for example would only make a SELECT and hand it over to
`read_one()`  (sql.rb) which then creates a new object (MyModel.allocate, which
only, if you didn't know that, prevents ruby from calling the `initialize()`).
The newly allocated object then is filled by `read_row()`, which just sets
instance variables (one for each field) on that object.
Conceptually pretty simple I think.  :)

> As far as I can tell, it's working -- no bug squashing needed on this front.

Good good.  :)

> I'm still feeling this relationship out though -- I'm actually curious about
> why I can refer to Character#account by "account", but Account#character only
> by self.character and why it treats "character" as a local variable (but
> not "account" in the Character class).

Well... simple Ruby:

class A
   attr_accessor :a

   def set(o)
     a = o # this will set an instance variable
     self.a = o # this will use `def a=()` which gets created by attr_acc
   end
end

A.new.set 'foo'
A.new.a = 'foo' # will do the same

The same applies for both Character and Account, not sure how your exact code
looks like of course.

Hope that helps,

Jo

-- 
Feel the love
http://pinkjuice.com/pics/ruby.png


More information about the Nitro-general mailing list