2009/4/29 serenobs <serenobs-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
>
> Hi.
>
> I have difficulties to model active record.
> So please help my trouble.
>
> Let''s suppose there are nations which have castles at least 1,
> and there are 3 types of castles.
>
> So I will make these tables.
> NationsTable,
> CastlesTable have common attributes of 3 types of castle.
> CastlesATable, CastlesBTable, CastlesCTable each have its unique
> attributes.
>
Easier to call your tables: ''nations'' for
''Nation'' model and ''castles'' for
''Castle'' model ... etc
>
> In this case how can I represent this DB to AR?
> I think
> class Nation < ActiveRecord::Base
> has_many :castles
> end
> class Castle < ActiveRecord::Base
> belongs_to :Nations
> end
>
Using the naming convention I suggested above you''d say:
belongs_to :nation
After all, a castle can only belong to one nation at a time right?
> but I''m not sure of what will be coded to these models.
>
> class CastleA < ActiveRecord::Base
> end
> class CastleB < ActiveRecord::Base
> end
> class CastleB < ActiveRecord::Base
> end
>
> please help me.
>
You could use single table inheritance (STI).
1) all castles are stored in one table (''castles'') which has
all the
required attributes for all types of castles.
2) in app/models you''ll have your Castle model and then you''ll
have a
CastleA,B and C models like above but you now inherit from Castle:
class CastleA < Castle
end
3) You include a ''type'' field in ''castles''
table which is a string and is
the same as the class name of the castle. (ie for an A-type it would be
''CastleA'')
This is a tidy way to handle your castles as everything is in one table. It
does mean that not all attributes will be used by a given castle instance if
you have specialised attributes; these will probably be null so I don''t
think the wastage will be much.
>
> and second question is
> when nation deleted, CastleA, CastleB have to be deleted but not for
> the castleC type.
> how can I do?
>
I''m never good at this stuff. But you could do it with a callback in
your
Nation model:
class Nation < ActiveRecord::Base
has_many :castles
before_destroy do |nation|
Castle.destroy_all "nation_id=#{nation.id} and
type!=''#{CastleC}''"
end
end
There''s probably a sexier way to do that.
--
Daniel Bush
http://blog.web17.com.au
http://github.com/danielbush/sifs/tree/master
http://github.com/danielbush
--~--~---------~--~----~------------~-------~--~----~
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
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---