Questions about ActiveRecord aggregation.

Hi all,

I'm quite new to rails. These may be silly questions, but I really
need your advice.

According to <<Agile Web Development with Rails>>, composite objects
in aggregation are value objects, which means their values cannot be
changed. So if say Person is the model class and Address is the
composite class, the way to update a person's address is to create a
new Address object, assign it to the person and then save. This works
fine with small composite object with just a few properties. If the
composite object has many properties, I think this will a performance
problem.

Now in my project, I get a table with about 50-60 columns. I want to
divide it into several parts using aggregation. The problem is that,
one of these composite objects will have 20 columns and another with
10 columns. I'm wondering if this will cause a performance problem
since each time even only one of the composite object's properties
needs to be updated, the whole 20 columns or so will be updated
together. Is there a way to avoid this? Or this is just the way rails
work?

I was thinking about split this big table into several small ones, but
this doesn't seem to be reasonable in a OO perspective. Do I have to
split the table in order to hold performance or is there better way?

Aonther question is about multi-layer aggregation, say I want to model
a table into A, B, C there classes and use a a.b.c relationship. Is
this possible?

Thanks a lot.

Hi all,

I’m quite new to rails. These may be silly questions, but I really
need your advice.

Not silly. Just inexperienced.

According to <>, composite objects
in aggregation are value objects, which means their values cannot be
changed. So if say Person is the model class and Address is the

composite class, the way to update a person’s address is to create a
new Address object, assign it to the person and then save.

Not the case, in actuality.
You can do
person.address.zipcode
= ‘63201’
person.address.save
or (since you said aggregation),
address1 = person.addresses[0]
address1.zipcode = ‘63201’
address1.save

This works
fine with small composite object with just a few properties. If the
composite object has many properties, I think this will a performance
problem.

Now in my project, I get a table with about 50-60 columns. I want to

divide it into several parts using aggregation. The problem is that,
one of these composite objects will have 20 columns and another with
10 columns. I’m wondering if this will cause a performance problem

since each time even only one of the composite object’s properties
needs to be updated, the whole 20 columns or so will be updated
together. Is there a way to avoid this? Or this is just the way rails
work?

If you only need to update one column, you can use lines such as:
person.address.update_attribute(“zipcode”, “63102”)

I was thinking about split this big table into several small ones, but
this doesn’t seem to be reasonable in a OO perspective. Do I have to
split the table in order to hold performance or is there better way?

Aonther question is about multi-layer aggregation, say I want to model
a table into A, B, C there classes and use a a.b.c relationship. Is
this possible?

Absolutely, as the other poster said. It is a standard practice in Rails.

Thanks a lot.

You’re welcome :slight_smile:

Thanks, man. This really helps a lot.

Thanks for your patient explanation. Where can I get a close look to
all this rails API besides the online document on the offical web
site. Is there a downlaodable version? Since I cannot stay online all
the time.

Another question: Say I want to create a composite class with 20
properties, must I create the initialize method using all these
properties? This is boring and easy-mistaken. Is there a better way to
do this?

Thanks for your reply, but I don't quite get it for the second
question. What do you mean by "put them all in hash" and
"instance[hash]"?

If you only need to update one column, you can use lines such as:
person.address.update_attribute("zipcode", "63102")

just want to clear this up. update_attribute() does not just update a
single column in the database. it updates the single attribute in the
model then saves the record..

same as doing

model.some_attribute = 'foo'
model.save

If you only need to update one column, you can use lines such as:
person.address.update_attribute(“zipcode”, “63102”)

just want to clear this up. update_attribute() does not just update a

single column in the database. it updates the single attribute in the
model then saves the record…

same as doing

model.some_attribute = ‘foo’
model.save

And, a further clarification… it is actually the same as

model.some_attribute = ‘foo’
model.save(false)
update_attribute does not perform validation
update_attributes does perform validation.