2011-10-27 15 views
5

Rails 3'te bir cinsiyet alanı oluşturmanın en iyi yolu nedir? PostgreSQL kullanıyorum.PostgreSQL'de Cinsiyet Ayarı

Şu anda bir dizgi var ama daha kolay (daha iyi?) Bir tamsayı olarak ayarlamak için olup olmadığını merak ediyorum. Eğer öyleyse, bu nasıl yapılır? Üç değer de dahil olmak üzere bir düşüş üretmek istiyorum: "Erkek", "Kadın", "İşletmenizin hiçbiri".

Temel soru için özür dilerim, ancak basit, en iyi uygulamalar hakkında merak ediyorum.

cevap

6

Bu etki için ne:

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; 

çıkışı:

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

Nasıl basit is_male:boolean alanını kullanarak dersiniz? İsterseniz,

Veya is_female.

Her iki durumda da, nil (null) varsayılan olarak doğru veya yanlış olarak değerlendirilmemelidir.

+0

Neden downvote? –

+0

Bu çok kısıtlayıcı bir çözümdür. Yerel enum türü çok daha spesifik bir özellik sağlar. Ayrıca "Her iki durumda da, nil (null) varsayılan olarak doğru veya yanlış olarak değerlendirilmemelidir." doğru değil. null değerler ruby'de falsey değerlerine göre değerlendirilir. –

2

Mike Jones katılıyorum. ENUM'lar bunun için mükemmel. ENUM'lar nadiren değişen küçük değer kümeleri için harikadır. Cinsiyet bunun mükemmel bir örneğidir. Genellikle sadece 5'e ihtiyacınız vardır: Erkek, Kadın, Interseks, Transseksüel, Bilinmeyen. Çoğu 3 ile git: Erkek, Kadın, Diğer. 2 Ancak (Erkek, Kadın), erkek ya da kadın olmayanlar içindir.

0

Çok kolay:

Sadece enum kullanın:

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');