#ruby-on-rails #database #migration
Вопрос:
У меня есть эта схема в Rails 6
create_table "fields", force: :cascade do |t|
t.string "title", limit: 100
t.text "description"
t.string "slug", limit: 20
t.integer "requests"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["slug"], name: "index_fields_on_slug", unique: true
t.index ["title"], name: "index_fields_on_title", unique: true
И внутри консоли рельсов:
field = Field.new
field.slug = 'a' *25
field.save
И запись успешно сохраняется в таблице полей.
Почему? У меня есть ограничение в 20 для :слизняка. Разве это не должно завершиться неудачей без проверки в модели?
Комментарии:
1. в разработке sqlite3 (локально)
2. В SQLite на самом деле нет
varchar(n)
char(n)
типов или, просто естьtext
. Вы можете создать столбец сvarchar(20)
типом, но он все равно будетtext
. Не используйте SQLite для разработки, установите ту же базу данных, которую вы собираетесь развернуть, и используйте ее для разработки и тестирования. Существуют всевозможные различия между базами данных, которые приведут вас в замешательство, поэтому разрабатывайте, тестируйте и развертывайте одну и ту же базу данных.3. Звучит правильно. Вы также могли бы использовать
t.references ... foreign_key: true
для этого.4.
t.references
добавит необходимый столбец и FK.5. ты был прав. После замены sqlite3 на mysql ограничения на уровне базы данных работали нормально, без проверки. Я потерял много времени на устранение неполадок sqlite3.