2011-10-27 9 views
5

Qual è il modo migliore per impostare un campo di genere in Rails 3? Sto usando PostgreSQL.Impostazione di genere in PostgreSQL

Attualmente l'ho come stringa ma mi chiedo se sarebbe più semplice (meglio?) Impostarlo come un numero intero. Se sì, come si farebbe? Voglio produrre un menu a discesa contenente tre valori: "Maschio", "Femmina", "Nessuno dei vostri affari".

Ci scusiamo per la domanda di base, ma sono curioso di semplici, buone pratiche.

risposta

6

Questo è ciò che i domini sono per:

DROP SCHEMA tmp CASCADE; 
CREATE SCHEMA tmp; 
SET search_path=tmp; 

CREATE DOMAIN gender CHAR(1) 
    CHECK (value IN ('F' , 'M')) 
    ; 

CREATE TABLE persons 
    (pname VARCHAR 
    , gend tmp.gender 
    ); 
INSERT INTO persons(pname, gend) VALUES ('Alice', 'F') ,('Bob', 'M') ; 
INSERT INTO persons(pname) VALUES ('HAL') ; 
INSERT INTO persons(pname, gend) VALUES ('Maurice', 'Q') ; 

SELECT * FROM persons; 

L'output:

DROP SCHEMA 
CREATE SCHEMA 
SET 
CREATE DOMAIN 
CREATE TABLE 
INSERT 0 2 
INSERT 0 1 
ERROR: value for domain gender violates check constraint "gender_check" 
pname | gend 
-------+------ 
Alice | F 
Bob | M 
HAL | 
(3 rows) 
0

ne dite di usare un semplice is_male:boolean campo?

Oppure is_female, se si preferisce.

In entrambi i casi, nil (null) non deve restituire true o false per impostazione predefinita.

+0

Perché il downvote? –

+0

Questa è una soluzione molto restrittiva. Il tipo di enum nativo offre molta più specificità. Inoltre "In entrambi i casi, nil (null) non deve essere valutato come vero o falso di default." non è vero. i valori nulli sono valutati su valori falsi in ruby. –

2

Sono d'accordo con Mike Jones. ENUM sono perfetti per questo. Le ENUM sono fantastiche per insiemi di valori piccoli che raramente cambiano. Il genere è un perfetto esempio di questo. Di solito hai solo bisogno di 5: Maschio, Femmina, Intersesso, Transgender, Sconosciuto. Molti vanno con 3: maschio, femmina, altro. 2 tuttavia (Maschio, Femmina) è indicativo per quelli che non sono maschi o femmine.

0

Molto facile:

Basta usare enum:

CREATE TYPE gen AS ENUM ('f', 'm'); 

CREATE TABLE lawyers_tb (
    ID SERIAL PRIMARY KEY, 
    name VARCHAR, 
    gender gen 
); 

INSERT INTO lawyers_tb (name, gender) 
    VALUES ('Jose Luis Gonzales', 'm'); 
Problemi correlati