I am trying to write a system with tables for engineers and system
users. Both are people. It would seem that:
class Person < ActiveRecord::Base
belongs_to :job, :polymorphic => true
end
class Engineer < ActiveRecord::Base
has_one :person, :as => :job
end
class SystemUser < ActiveRecord::Base
has_one :person, :as => :job
end
would be a way of doing that provided that the two groups did not
overlap (which of course they do). I am not at all keen to have
engineer and system user attributes in the person table.
I am sure there is a very simple solution to this but so far research
has come up with overly complicated answers. Can anyone point me in the
right direction?
I am trying to write a system with tables for engineers and system
users. Both are people. It would seem that:
class Person < ActiveRecord::Base
belongs_to :job, :polymorphic => true
end
class Engineer < ActiveRecord::Base
has_one :person, :as => :job
end
class SystemUser < ActiveRecord::Base
has_one :person, :as => :job
end
Waiiiit...engineers and system users are *jobs*? That's what your
associations would seem to say, unless I'm misreading.
would be a way of doing that provided that the two groups did not
overlap (which of course they do). I am not at all keen to have
engineer and system user attributes in the person table.
Do engineers and system users require different sets of fields in their
respective tables? If not, you could just unify them as a single Person
class with a role field.
I am sure there is a very simple solution to this but so far research
has come up with overly complicated answers. Can anyone point me in the
right direction?
Why? The simplest solution is usually the best. How many million
users will you have if disc space is your worry? You might want to
look at STI if you want to keep the types functionally distinct,
though again the simplicity of an all in one table with a role is
usually preferable. You will easily find a plugin that will handle
roles for you to make life even easier. The less code you write the
fewer bugs you will have and the easier it will be to code, test and
maintain.