Я использую 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
Я предполагаю, что вы столкнулись с конфликтом ИППП, а не с проблемой 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 Не уверен, работает ли это в Rails4, но со времен Rails5 я таскал за собой проблему STISuppression
, которая использует nil
, чтобы явно указать STI, чтобы она ушла.
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
.
Ничего себе, я не знал, что вы можете просто назначить ноль.