2016-04-15 7 views
1

Все значения, поступающие из веб-формы, являются строками. У меня есть класс с именем Announcement, который имеет поле kind и его тип данных целое. В классе модели я определяю перечислениеМассовое присвоение рельсов по целочисленному значению из формы

enum kind: { 
    event: 1, 
    feature: 2 
} 

О массовом назначении Я сделал это, не проблема вообще. Проблема в том, что когда я делаю это, он будет жаловаться на '1' is not a valid kind, потому что это строка, а не целое число.

announcement=Announcement.new(announcement_params) 

Есть ли решение этой проблемы, кроме того, что вручную задано значение для поля? Спасибо

+0

что тип данных любезного поля в вашей миграции? – uzaif

+0

и выставляем ваш метод 'announcement_params' – uzaif

+0

@uzaif int int –

ответ

0

Ответ просто прийти на ум, это то, что я сделать, чтобы решить проблему

kind=params[:announcement][:kind].to_i 
params[:announcement].delete(:kind) 
params[:announcement].merge(kind: kind) 
  1. Получить kind параметров и преобразовать его в целое число
  2. Удалите kind, который представляет собой строку из параметров
  3. Объединить новый kind с параметрами

И последнее белые параметры списка для массового назначения

Спасибо @uzaif

0

Вы можете переопределить сеттер для kind атрибута в вашей Announcement модели, как это:

# app/models/announcement.rb 
def kind=(value) 
    super(value.to_i) 
    # or 
    # super(Integer(value)) 
end 

Это преобразует заданное значение в целое число сначала, а затем вызывает исходный метод, определенный enum. Обратите внимание, однако, что to_i будет конвертировать что угодно, даже не номера или nil s - они будут преобразованы в 0. Поэтому я бы посоветовал либо никогда не использовать 0 среди ваших определенных значений перечисления, либо использовать форму Integer(value), что приведет к возникновению исключения по не номерам или nil s.

инкубаторе позволяет массовое назначение еще раз:

Announcement.new(kind: '1') # should be OK 
Смежные вопросы