Я использую метод Tap Ruby в моем seed.rb следующим образом:
PaymentMode.find_or_create_by(name: "Cash").tap do |pm|
pm.instrument = false
pm.bank_account_allocation = false
pm.save!
end
В schema.rb модель PaymentMode выглядит так:
create_table "payment_modes", force: :cascade do |t|
t.string "name"
t.boolean "instrument", null: false
t.boolean "bank_account_allocation"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["name"], name: "index_payment_modes_on_name", unique: true
end
Я хочу, чтобы, если кто-то обновит начальный файл (например, кто-то может обновить pm.bank_account_allocation = true), а затем запустить rake db:seed
, соответствующие данные payment_mode должны быть обновлены, поэтому я использую find_or_create_by
Он работал нормально, но после того, как я добавил null: ложное ограничение в моем PaymentMode (см. схему), я получаю эту ошибку: -
PG::NotNullViolation: ERROR: null value in column "instrument" violates not-null constraint
Могу ли я обойти эту ошибку? Если нет, есть ли способ поместить данные в мой seed.rb, чтобы, если кто-то обновит начальное число, он обновил соответствующий объект ActiveRecord?
P.S. Я не хочу сохранять ограниченный столбец внутри параметров find_or_create_by, подобных этому PaymentMode.find_or_create_by(name: "Cash", instrument: false).tap
, так как это создаст другой объект, если кто-то обновит инструмент: false до инструмента: правда
rails db:migrate
, правильно? Если это так, то это просто потому, что у вас уже есть некоторые записиPaymentMode
, поэтому создание столбца без указания значения по умолчанию будет означать присвоение ему значенияnil
, которое, очевидно, является тем, что вы указали в своей миграции, чтобы его не было. - person PericlesTheo   schedule 18.04.2019#find_or_create_by
. Вероятно, проще всего было бы разбить его на несколько методов. - person PericlesTheo   schedule 18.04.2019PaymentMode.create_with(instrument: false).find_or_create_by(name: "Cash")
- person Smek   schedule 18.04.2019