Rails сохраняет значение в базе данных за пределами предельного ограничения

#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.