how to deal with gender

Appreciate this is a path well travelled probably.

What's the best way of to deal with gender.

i.e. a Person is either Male or Female (generally and fot my purposes
I'll stick with that rule).

So is it best to go Person with an attribute gender, or, I guess it's
best to do something like this - the rails way?

Person
  belongs_to: gender

Gender
  has_many: people

Sorry if this is such an obvious question just want to do it right.

Might just be me, but I've always thought of gender as an attribute of a
person in your context.

I'm not sure where a gender model comes into all of this, but you may be
thinking of something I'm not.

To populate from a static array or from AR… I had the same quandry and ended up doing it the ‘rails’ way as you describe below. Although as you said, it is such a static thing that might as well use a constant array. The other question is to store M/F in Person.gender or store an integer.

Since rails should be caching the model, I dont think it is a real big difference performance-wise either way. I think it probably comes down to your aesthetics, what feels right and what looks best to you.

Thanks chaps.

It's now got me thinking. This stuff is not as easy as it looks. Ive
given up on gender when I realised that a name can belong to both
genders!

In English my app is a baby name chooser

A baby can have many proposed names but only one surname.

A name can be of many types, forename / middlename etc

Any tips how to model this!

David Kahn wrote:

To populate from a static array or from AR.... I had the same quandry

According to the way I think, a model object is something you CURD
(create, update, read, or delete). Unless you're God you're not going to
be creating or deleting genders.

I'd go with a static enumeration (Male, Female or M, F or 0, 1). For the
sake of the "simplest solution that could possibly work," I'd go with
Male/Female. No added complexity in having to format the data for the
view.

It's not just you.

bingo bob wrote:

Thanks chaps.

It's now got me thinking. This stuff is not as easy as it looks. Ive given up on gender when I realised that a name can belong to both genders!

In English my app is a baby name chooser

A baby can have many proposed names but only one surname.

A name can be of many types, forename / middlename etc

Any tips how to model this!

The name itself should have "name", "boys", and "girls" where boys and girls are booleans.

How many types? I only see two types, "forname", "middlename". Are you trying to build a baby name to put into a "shopping cart" of some sort?

How many types? I only see two types, "forname", "middlename". Are you
trying to build a baby name to put into a "shopping cart" of some sort?

I'm trying to develop an app where the full proposed baby name is kind
of built up by the user - i envisage some dragging and dropping to
reorder the firstnames - several combinations of "(forname +
middle(optional)) + surname" can be reordered to generate the final full
name and yes, I can only think that forname and middle name will be
necessary. Such a seemingly simple task but when I get to think about it
the options for the model seem endless!

Also, I don't want to end up in ruby typing things like this.

name = Name.find_by_name("some_name") # seems ridiculous - too many
names.

grrr, maybe like this.

Baby
  has_many :givennames

  - gender, string
  - surname, string

GivenName
  belongs_to :baby

  - value, string
  - position, integer

Are names generated by the user or do they see a list that *you* have
entered into the assumed database?

So then I write stuff like

firstname = Baby.first.given_name.first
fullname = firstname + " " + Baby.first.surname

Sorry that code was wrong, I guess it would be something like...

firstname = Baby.first.given_name.first.value
fullname = firstname + " " + Baby.first.surname

Hi Pale Horse,

The names would be generated by the user, they are proposed new baby
names. The surname of the baby is of course fixed but needs to be
entered, it is that of the parents. Hope that makes sense.

Amazing how much there is to think about from a seemingly trivial job!

bb

bingo bob wrote:

The names would be generated by the user, they are proposed new baby
names. The surname of the baby is of course fixed but needs to be
entered, it is that of the parents. Hope that makes sense.

Amazing how much there is to think about from a seemingly trivial job!

Indeed, but I think you're overcomplicating the issue.

bb

So, a simple form with the following fields:

Forename, Surname (both stored as strings). *Two* check boxes to
determine whether the name is for a male and/or female, and of course a
save button.

Present this form only after a User has logged in.

Now, a ProposedNames table with the following columns:

user_id:integer
forename:string
midname:string
surname:string
male:tinyint
female:tinyint

This allows Users to save their proposed names into a database for later
retrieval.

You can then give the view permission to re-order and alter these names
at any time, by displaying a list of proposed names to the User in a
secure area.

No validation on the column names are necessary, realistically.

Unless I've misunderstood your request, I don't see any problems with
this approach.

Horseman.

Thanks for this.

Great.

But you can have multiple middle names!

Annoying but true

Bb

bingo bob wrote:

Horseman.

Thanks for this.

Great.

But you can have multiple middle names!

An unlimited amount? In that case, you might consider storing the
entered forenames and middles names into separate tables and creating a
suggestion tool.

I recommend, taking a look at
http://railscasts.com/episodes/75-complex-forms-part-3 for adding other
fields dynamically.

An unlimited amount?

Well yes, I believe so. In the vast majority of cases people just have
firstname surname, also firstname middlename surname. But in essence
they could have 100 middle names; although it's a little unlikely I
don't believe there are legal constraints here in the UK.

Pragmatically though -
I think I'll go with a minor adaptation(s) of your first solution..

ProposedNames table with the following columns:

user_id :integer
forename :string
midname1 :string
midname2 :string
midname3 :string
midname4 :string
midname5 :string
surname :string
gender :string

Really appreciate your other points re how I might handle the form and
logic. Got to love railscasts, I'd be nowhere without them, they are
truly excellent.

bingo bob wrote:

An unlimited amount?

Well yes, I believe so. In the vast majority of cases people just have
firstname surname, also firstname middlename surname. But in essence
they could have 100 middle names; although it's a little unlikely I
don't believe there are legal constraints here in the UK.

Pragmatically though -
I think I'll go with a minor adaptation(s) of your first solution..

ProposedNames table with the following columns:

user_id :integer
forename :string
midname1 :string
midname2 :string
midname3 :string
midname4 :string
midname5 :string
surname :string
gender :string

Really appreciate your other points re how I might handle the form and
logic. Got to love railscasts, I'd be nowhere without them, they are
truly excellent.

I agree with your proposed structure. It would be my recommendation, but
you did specify 'unlimited'.

It seems *pointless* for a human to have > 7 names.

Apologies for omitting the midname column from my original
recommendation.

I realised that it's best to ignore the "one in a million" scenario, and
do what works in 99.9% of cases.

bingo bob wrote:

I realised that it's best to ignore the "one in a million" scenario, and
do what works in 99.9% of cases.

"All that is complex is not useful. All that is useful is simple."

As I said in my initial reply, you were overcomplicating it.

Now if we could just stop thinking that the world is composed solely
of middle class white anglo saxon males and face the reality. Naming
conventions in some cultures go well beyond forename plus surname.
Those people also live in the UK.

I also note that you are omitting titles and suffixes such as "Queen
Elizabeth II" who is also called "Elizabeth Alexandra Mary Windsor".
Or even "Hank Williams Jr" or "Hank WIlliams III" or "Sir Robert
Geldof"

Some people have only one name which is neither a forename or a surname.

Lets ignore the artist formerly known a Prince for a moment :slight_smile:

To be honest I would go with

user_id :integer
title :string
forename :string
midname :string
surname :string
suffixes :string
gender :string

and treat midname as a space separated list of names (although this
wont handle names like 'st clair' correctly).

Peter Hickman wrote:

I also note that you are omitting titles and suffixes such as "Queen
Elizabeth II" who is also called "Elizabeth Alexandra Mary Windsor".
Or even "Hank Williams Jr" or "Hank WIlliams III" or "Sir Robert
Geldof"

Some people have only one name which is neither a forename or a surname.

Lets ignore the artist formerly known a Prince for a moment :slight_smile:

To be honest I would go with

user_id :integer
title :string
forename :string
midname :string
surname :string
suffixes :string
gender :string

and treat midname as a space separated list of names (although this
wont handle names like 'st clair' correctly).

I am *sure* the intended audience of this application would be content
with my proposal, but pursuing this argument is a waste of time and
resources.