Как я могу установить некоторые значения по умолчанию для столбца в рельсах? - PullRequest
0 голосов
/ 10 января 2020

Итак, у меня есть таблица в моем веб-приложении rails, которая выглядит следующим образом в файле "db / schema.rb":

create_table "checks", force: cascade do |t|
  t.text "name"
  t.datetime "created_at", precision: 6, null: false
  t.datetime "updated_at", precision: 6, null: false
  t.string "status", default: "pending", null: false
end

Мой вопрос заключается в том, как установить три значения "по умолчанию" в положение дел. Я только хочу, чтобы значения "pending", "schedule" и "runnin" были в состоянии, так что они установлены как значение "status".

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

Был бы очень признателен за быстрый ответ. Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Вы должны использовать модель, чтобы сделать это, следующий пример. в вашей миграции добавьте следующее

t.integer "status", default: 1, null: false

Теперь в вашей модели app/models/checks.rb введите следующие коды

  STATUS = {
    pending: 0,
    scheduled: 1,
    runnin: 2
  }.freeze

  enum status: STATUS

Теперь вы также можете получить доступ как следующие

check = Check.first
puts check.status

Так вы на самом деле сохраняете enum в целое число, значения которого вы определяете в модуле. Это один из способов сделать это.

1 голос
/ 10 января 2020

Чтобы расширить ответ Камала, вам не нужно определять га sh, а затем устанавливать перечисление. Вместо этого вы можете использовать массив символов.

enum status: %i[pending scheduled runnin]

Когда вы можете получить доступ / просмотреть перечисление ha sh с помощью Check.statuses, которое вернет {pending: 0, scheduled: 1, runnin: 2} и просто как он сказал:

check = Check.first
puts check.status

Перечисление Rails также дает вам доступ к областям действия и методам экземпляра.

Check.pending # returns ALL pending checks

# if check belongs to any other model....
other = Other.first
other.checks.pending # returning all pending checks that belong to the instance of other model

#boolean checks
check = Check.first
check.pending? # returns true or false if the check has the enum 0

# setting the enum
check = Check.first
check.pending! # sets and saves the check's status as pending

А затем установить значение по умолчанию, как сказал Камаль

t.integer, :status, default: 1, null: false, index: true

Что касается установки 3 различных значений по умолчанию, вы не можете. Вам нужно выбрать одно из значений перечисления и установить его по умолчанию, как указано выше.

При создании Check вы можете установить значение либо с помощью !, показанного выше, либо в параметрах создания, если вы хотите установить для него значение, отличное от значения по умолчанию:

pending_status = Check.statuses[:pending]
Check.create(status: pending_status)

Этот метод полезен, поэтому вам не нужно беспокоиться о положении перечислений, если они впоследствии изменятся в процессе разработки.

Перечисление рельсов

...