Сохранение данных, которым удовлетворяют для перечислений

Материализованный where вернет коллекцию, так что вы можете получить первую запись с помощью .first

User.where(:user_name => "john").first&.id

Или использовать find_by, которая вернет первую запись, которая удовлетворяет условию.

User.find_by(:user_name => "john")&.id
22
задан Brian Tompsett - 汤莱恩 1 November 2015 в 17:53
поделиться

8 ответов

Мы храним перечислимые значения с помощью некоторой явной строки или символьного значения в базе данных. Затем для движения от базы данных оценивают назад перечислению, которое мы пишем статическому методу для класса Enum, чтобы выполнить итерации и найти правильный.

, Если Вы ожидаете много перечислимых значений, Вы могли бы создать статическое отображение HashMap<String,MyEnum> для перевода быстро.

не хранят фактическое перечислимое имя (т.е. "АКТИВНЫЙ" в Вашем примере), потому что это легко пересмотрено разработчиками.

8
ответ дан Jason Cohen 29 November 2019 в 05:45
поделиться

Joshua Bloch дает превосходное объяснение перечислений и как использовать их в его книге" Эффективный Java, Второй Выпуск ", (p.147)

Там можно найти все виды приемов, как определить перечисления, сохранить их и как быстро отобразить их между базой данных и кодом (p.154).

Во время разговора в Jazoon 2007, Bloch привел следующие причины для использования дополнительного атрибута для отображения перечислений на поля DB и назад: перечисление является константой, но код не. Чтобы удостовериться, что разработчик, редактирующий источник, не может случайно повредить DB, отображающийся путем переупорядочения перечислений или переименования затем, необходимо добавить определенный атрибут (как "dbName") к перечислению и использованию что отобразить его.

Перечисления имеют внутренний идентификатор (который используется в переключателе () оператор), но этот идентификатор изменяется при изменении порядка элементов (например, путем сортировки их или путем добавления элементов в середине).

, Таким образом, лучшее решение состоит в том, чтобы добавить toDB () и fromDB () метод и дополнительное поле. Я предлагаю использовать короткие, читаемые строки для этого нового поля, таким образом, можно декодировать дамп базы данных, не имея необходимость искать перечисления.

2
ответ дан Aaron Digulla 29 November 2019 в 05:45
поделиться

Я использую смешение трех подходов, которые Вы зарегистрировали...

Используйте базу данных в качестве авторитетного источника для Перечислимых значений. Сохраните значения в какой-то таблице 'кода'. Каждый раз Вы создаете, генерируете файл класса для Перечисления, которое будет включено в Ваш проект.

Таким образом, если перечислимое значение изменений в базе данных, Ваш код будет правильно делаться недействительным, и Вы получите соответствующие ошибки компиляции от своего Непрерывного Сервера интеграции. У Вас есть привязка со строгим контролем типов к Вашим перечисляемым значениям в базе данных, и Вы не должны волноваться о ручной синхронизации значений между кодом и данными.

3
ответ дан 29 November 2019 в 05:45
поделиться

В то время как я не знаком с идеей "атрибутов" в Java (и я не знаю, какой язык Вы используете), я обычно использовал идею кодовой таблицы (или зависящие от домена таблицы), и я приписал свои перечислимые значения с более определенными данными, такие как человекочитаемые строки (например, если бы моим перечислением значений является NewStudent, я приписал бы его с "Новым Студентом" как значение дисплея). Я затем использую Отражение, чтобы исследовать данные в базе данных и вставить или обновить записи, чтобы принести им в соответствии с моим кодом, с помощью фактического перечисления значений в качестве ключевого идентификатора.

1
ответ дан 29 November 2019 в 05:45
поделиться

То, что я использовал в нескольких occations, должно определить перечисление в коде и представление устройства хранения данных в слое персистентности (DB, файл, и т.д.) и затем иметь методы преобразования для отображения их друг на друга. Эти методы преобразования должны только использоваться при чтении из или записи в персистентное хранилище, и приложение может использовать безопасные с точки зрения типов перечисления везде. В методах преобразования я использовал операторы переключения, чтобы сделать отображение. Это позволяет также выдавать исключение, если новое или неизвестное состояние должно быть преобразовано (обычно, потому что или приложение или данные являются более новыми, чем другие и новые или дополнительные состояния были объявлены).

1
ответ дан 29 November 2019 в 05:45
поделиться

Если существует, по крайней мере, незначительный шанс, что список значений должен будет быть обновлен, чем это 1. Иначе это 3.

1
ответ дан 29 November 2019 в 05:45
поделиться

Хорошо у нас нет DBA для ответа на, таким образом, наше предпочтение для опции 2).

Мы просто сохраняем Перечисление значений в базу данных, и когда мы загружаем данные из базы данных и в наши Объекты области, мы просто бросаем целочисленное значение к перечислимому типу. Это избегает любой из головных болей синхронизации с опциями 1) и 3). Список определяется однажды - в коде.

Однако у нас есть политика, что никто больше не получает доступ к базе данных непосредственно; они должны проникнуть через наши веб-сервисы для доступа к любым данным. Таким образом, это - то, почему это работает хорошо на нас.

1
ответ дан 29 November 2019 в 05:45
поделиться

В Вашей базе данных первичный ключ этой "доменной" таблицы не должен быть числом. Просто используйте varchar pk и столбец описания (в целях, которые Ваш dba затронут). Если необходимо гарантировать, что упорядочивание значений, не полагаясь на алфавитный sor, просто добавляет числовой столбец, названный "порядок или "последовательность".

В Вашем коде создайте статический класс с константами, имя которых (в корпусе верблюдом или не) отображается на описание и карты ценности к pk. Если Вы нуждаетесь в больше, чем это, создаете класс с необходимой структурой и операторами сравнения и используете экземпляры ее как значение констант.

Если Вы делаете это слишком много, создайте сценарий для генерации instatiation / код объявления.

1
ответ дан 29 November 2019 в 05:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: