#database #ruby-on-rails-3 #postgresql
#База данных #ruby-on-rails-3 #postgresql
Вопрос:
Каков наилучший способ настроить поле пола в Rails 3? Я использую PostgreSQL.
В настоящее время у меня это в виде строки, но мне интересно, будет ли это проще (лучше?) чтобы настроить его как целое число. Если да, то как это можно сделать? Я хочу создать для него выпадающий список, включающий три значения: «Мужской», «Женский», «Не твое дело».
Извините за основной вопрос, но мне интересно узнать о простых, лучших практиках.
Ответ №1:
Для этого и нужны домены:
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', 'Z') ;
SELECT * FROM persons;
Вывод:
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)
Ответ №2:
Перечисление кажется лучшим: http://www.postgresql.org/docs/current/static/datatype-enum.html
Ответ №3:
Я согласен с Майком Джонсом. Перечисления идеально подходят для этого. ПЕРЕЧИСЛЕНИЯ хороши для небольших наборов значений, которые редко меняются. Пол является прекрасным примером этого. Обычно вам нужно всего 5: мужчина, Женщина, интерсексуал, трансгендер, неизвестный. Многие используют 3: мужской, женский, Другой. 2 однако (мужской, женский) означает для тех, кто не является мужчиной или женщиной.
Ответ №4:
Как насчет использования простого is_male:boolean
поля?
Или is_female
, если вы предпочитаете.
В любом случае, nil (null) не должен по умолчанию принимать значение true или false.
Комментарии:
1. Это очень ограничительное решение. Собственный тип enum обеспечивает гораздо больше специфичности. Также «в любом случае, nil (null) не должен по умолчанию принимать значение true или false». неверно. значения null оцениваются как ложные значения в ruby.
Ответ №5:
Очень просто:
Просто используйте 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');