2015-09-01 6 views
0

У меня есть класс постоянная в моем приложении Rails для отображения целых чисел из столбца в строки:Выбор строки на основе целочисленного столбца

TYPES = [[1, "Beginner"], [2, "Intermediate"], [3, "Advanced"]] 

я могу использовать это для преобразования целых чисел в удобочитаемых строки для экземпляров (например, TYPES.to_h[type_id]), но я также хотел бы использовать его для SELECT удобочитаемой строки для большого количества записей за один раз. Я мог бы использовать CASE заявление:

SELECT *, CASE WHEN type_id = 1 THEN 'Beginner' 
    WHEN type_id = 2 THEN 'Intermediate' 
    WHEN type_id = 3 THEN 'Advanced' 
END AS type_string FROM users; 

Однако, это становится очень многословным, трудно управлять, и отнимает много времени, как TYPES массив становится даже немного больше. Есть ли лучший, более эффективный способ выбрать строку типа из type_id?

+0

Вы ищете что-то вроде перечислений. Что перечисляет для вас, так это сопоставляет список символов для ссылки, который будет храниться в базе данных как целое. Итак: корова может быть 0 и: собака может быть 1 в перечислении [: cow,: dog]. Ссылка ссылки http://6ftdan.com/allyourdev/2015/03/31/rails-4s-awesome-enums/ – praaveen

+0

@muistooshort Мне действительно нужно ЗАКАЗАТЬ строк для просмотра admin, который является единственным случаем, в котором я нуждаюсь строки в запросе db. Должен ли я думать об этом по-другому? – eirikir

ответ

1

Ваша потребность создать отображение на вашем db вместо рельсов.

Create table types as (
    type_id Int, 
    name varchar(100) 
) 

При этом вы можете добавлять/удалять/обновлять типы и код не сломают

Затем присоединиться как таблицу с этим одним

SELECT u.*, t.name 
FROM users u 
inner join types t 
    on u.type_id = t.type_id 

Если необходимо отображение в rails вы делаете

select * from types 

и инициализировать переменную TYPES.

+0

Итак, на самом деле это я изначально настроил, но моя команда просит изменить использование константы класса, поэтому логика не зависит от состояния базы данных. Однако я устойчив к этому, и, возможно, инициализация переменной TYPES из базы данных обеспечивает хорошую среднюю позицию, но мне все же хотелось бы решить мою первоначальную проблему для сравнения ... – eirikir

1

Вы всегда можете сделать другую модель (будьте осторожны, используя зарезервированное слово «тип» в рельсах). ActiveRecord отлично подходит для этих вещей. Не храните эти данные в коде, особенно если вам нужно их сортировать или он может расти. Вы можете создать пользовательский интерфейс для управления уровнями опыта в пространстве имен admin, которое ограничено обычными пользователями.

В этом примере используется имя класса ExperienceLevel.

class ExperienceLevel < ActiveRecord::Base 

    has_many :users, foreign_key: "type_id" 

    # has an attribute called 'name' 

end 

Добавить ассоциацию с пользователем

class User < ActiveRecord::Base 

    belongs_to :experience_level, foreign_key: "type_id" 

end 

А потом ссылаться на него в представлениях рельсам, как и следовало ожидать

@user.experience_level.name 
Смежные вопросы