Forum: Ruby on Rails Questions about ActiveRecord aggregation.

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.
1292dfc5df2064e008f7f12b9c56561d?d=identicon&s=25 allen (Guest)
on 2007-04-06 12:06
(Received via mailing list)
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.
E3513c4edd6810bb4b9914b58da2a2c3?d=identicon&s=25 Jamal Soueidan (jamal)
on 2007-04-06 21:08
allen wrote:
> Hi all,
>
> 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.

Yes,

Take a look here:

http://api.rubyonrails.org/classes/ActiveRecord/As...
2017657725dd1bce83dc8a1e2e991d04?d=identicon&s=25 Luke Ivers (technodolt1)
on 2007-04-06 22:33
(Received via mailing list)
On 4/6/07, allen <allenmacyoung@gmail.com> wrote:
>
>
> 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 <<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.


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
> 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 :)
1292dfc5df2064e008f7f12b9c56561d?d=identicon&s=25 allen (Guest)
on 2007-04-07 12:36
(Received via mailing list)
Thanks, man. This really helps a lot.

On 4ÔÂ7ÈÕ, ÉÏÎç3ʱ08·Ö, Jamal Soueidan <rails-mailing-l...@andreas-s.net>
1292dfc5df2064e008f7f12b9c56561d?d=identicon&s=25 allen (Guest)
on 2007-04-07 12:44
(Received via mailing list)
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?
E3513c4edd6810bb4b9914b58da2a2c3?d=identicon&s=25 Jamal Soueidan (jamal)
on 2007-04-07 19:24
allen wrote:
> 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.

One way

1. Download Rails sources (svn export
http://dev.rubyonrails.org/svn/rails/trunk target_dir)
2. cd target_dir/railties
3. rake
4. This gives you a target_dir/rails/doc/api/index.html, containing the
complete Rails API docs.

Source: http://article.gmane.org/gmane.comp.lang.ruby.rails/6047
Google:
http://www.google.dk/search?q=download+rubyonrails...
Keyword: download rubyonrails doc

> 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?

It will be easier for you to put them all in hash

instance[hash]
1292dfc5df2064e008f7f12b9c56561d?d=identicon&s=25 allen (Guest)
on 2007-04-09 03:41
(Received via mailing list)
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]"?


On Apr 8, 1:24 am, Jamal Soueidan <rails-mailing-l...@andreas-s.net>
A2c85dc5ee81b12e3cc0a6522e8d079d?d=identicon&s=25 Chris Hall (au5lander)
on 2007-04-09 12:59
(Received via mailing list)
>
> 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
2017657725dd1bce83dc8a1e2e991d04?d=identicon&s=25 Luke Ivers (technodolt1)
on 2007-04-09 20:30
(Received via mailing list)
On 4/9/07, Chris Hall <christopher.k.hall@gmail.com> wrote:
>
> 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.
This topic is locked and can not be replied to.