Rails использует тип enum в качестве значения для атрибута - PullRequest
0 голосов
/ 10 октября 2019

Вот мое определение модели:

class OrderFrequency < ApplicationRecord
  self.table_name = "order_frequencies"
  enum frequency_unit: { hour: 1}

end

и миграция

class CreateOrderFrequencies < ActiveRecord::Migration[5.2]
  def change
    create_table :order_frequencies do |t|
      t.string :value
      t.integer :unit
      t.timestamps
    end
  end
end

Так как мне присвоить атрибут unit с перечислением frequency_unit?

Я не могу сделать

OrderFrequency.create(value: 'value 123', unit: OrderFrequency.frequency_unit.hour)

Как правильно использовать frequency_unit enum для атрибута unit?

Спасибо

1 Ответ

1 голос
/ 10 октября 2019

См. официальную документацию для ActiveRecord::Enum - идея не в том, чтобы иметь два имени атрибута (unit и frequency_unit);у вас должен быть только один . (В конце концов, это то же самое!)

Давайте изменим вашу модель на:

class OrderFrequency < ApplicationRecord
  # Note: Specifying the (default) table_name here is also redundant
  enum unit: { hour: 1 }
end

Теперь вы можете создать запись с помощью:

OrderFrequency.create(
  value: 'value 123',
  unit: OrderFrequency.units['hour']
)

Или даже(!!) просто записав:

OrderFrequency.create(
  value: 'value 123',
  unit: 'hour'
)

Основная идея с ActiveRecord::Enum заключается в том, что в базе данных значение сохраняется как целое число, но в приложении (99% времени) вы можете работать с удобными для человека String с - то есть "hour", а не 1.

Если по какой-то причине вам необходимо получитьсписок всех известных unit s, вы можете сделать это с помощью:

OrderFrequency.units.keys #=> ['hour']
...