Как в Rails 4 ссылаться на значение перечисления при инициализации моей модели?

Я использую Rails 4.2. В настоящее время нет возможности обновиться. у меня есть эта модель

class OrderItem < ApplicationRecord
    …
  enum type: { data: “Data”, product: “Product” }

Как мне инициализировать мой объект, ссылаясь на мое перечисление? я пробовал это

@order_item = OrderItem.new(
  order_item_params.merge(
    type: :product
  )
)
…
@order_item.save

Но это приводит к ошибке

 NoMethodError:
   undefined method `safe_constantize' for :product:Symbol
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
14
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предполагаю, что вы столкнулись с конфликтом ИППП, а не с проблемой enum. Rails резервирует имя столбца type для наследования одной таблицы (STI) и использует type для хранения имени класса, но вы пытаетесь сохранить символ в type. ActiveRecord пытается преобразовать значение type в класс, отсюда и жалоба на невозможность вызвать safe_constantize для вашего символа :product.

Вы можете использовать другое имя для своего столбца или указать ActiveRecord использовать другое имя (предположительно то, что вы никогда не использовали) для STI:

class OrderItem < ApplicationRecord
  self.inheritance_column = '_type'
  ...
end

Я думаю, что self.inheritance_column = nil также будет работать в Rails4, я знаю, что nil работает в Rails6, но я не уверен насчет Rails4.

Ничего себе, я не знал, что вы можете просто назначить ноль.

max 07.04.2022 23:03

@max Не уверен, работает ли это в Rails4, но со времен Rails5 я таскал за собой проблему STISuppression, которая использует nil, чтобы явно указать STI, чтобы она ушла.

mu is too short 07.04.2022 23:17
Ответ принят как подходящий

TLDR:

class OrderItem < ApplicationRecord
  self.inheritance_column = 'definitely_not_type'
  enum type: { data: "Data", product: "Product" }

type — значение по умолчанию для столбца наследников в Rails. Этот столбец в основном используется для наследования одной таблицы. Когда он присутствует, ActiveRecord будет использовать значения в этом столбце в качестве класса для каждой строки, которую он извлекает из базы данных.

Итак, учитывая таблицу animals с этими значениями:

id | type   | name
------------------------
1  | Cat    | Mr Mittens
2  | Dog    | Laika
3  | Snake  | Snek

Когда вы позвоните Animal.all.map {|m| m.class} , вы получите [Cat, Dog, Snake]. Или, по крайней мере, вы будете, если эти константы действительно существуют.

Если вы на самом деле не используете STI и хотите использовать имя type, вы можете просто назначить ему все, что хотите self.inheritance_column.

Другие вопросы по теме