Я использовал Railsgenerate для создания таблицы ProjectType и таблицы ProjectGroup, которая ссылается на тип проекта. Я успешно создал тип проекта через браузер, но при попытке создать группу проектов получаю ошибку:
Вход:
Имя: АСДФ
Тип проекта: 1
Поднимает:
ActiveRecord::StatementInvalid in ProjectGroupsController#create SQLite3::SQLException: no such table: main.ProjectTypes
Однако, когда я проверяю irb после получения этой ошибки, у меня появляется:
irb(main):001> ProjectType.all
ProjectType Load (0.1ms) SELECT "project_types".* FROM "project_types" /* loading for pp */ LIMIT ? [["LIMIT", 11]]
=> [#<ProjectType:0x000000011f7977f8 id: 1, name: "1", created_at: Sat, 01 Jun 2024 02:51:48.921453000 UTC +00:00, updated_at: Sat, 01 Jun 2024 02:51:48.921453000 UTC +00:00>]
Это означало бы для меня, что таблица действительно существует.
Если я попытаюсь создать группу проектов с Projecttype: 2 в браузере, я просто получаю сообщение об ошибке формы: 1 ошибка запретила сохранение этой группы проектов: Тип проекта должен существовать
Но это не разрывает страницу.
Я был бы признателен за любое направление решения этой проблемы. Это также влияет на мои настройки при загрузке данных. Я получаю ошибки при проверке PRAGMA Foreign_key_check для групп проектов и типов проектов.
моя схема:
create_table "project_groups", force: :cascade do |t|
t.string "name"
t.integer "ProjectType_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["ProjectType_id"], name: "index_project_groups_on_ProjectType_id"
end
create_table "project_types", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_foreign_key "project_groups", "ProjectTypes"
пытаюсь создать в IRB:
irb(main):008> ProjectGroup.new(name:"something", ProjectType_id:1)
=> #<ProjectGroup:0x000000012d995150 id: nil, name: "something", ProjectType_id: 1, created_at: nil, updated_at: nil>
irb(main):009> ProjectGroup.create(name:"something", Project_Type_id:1)
(irb):9:in `<main>': unknown attribute 'Project_Type_id' for ProjectGroup. (ActiveModel::UnknownAttributeError)
raise UnknownAttributeError.new(self, k.to_s)
^^^^^
irb(main):010> ProjectGroup.create(name:"something", ProjectType_id:1)
TRANSACTION (0.2ms) begin transaction
ProjectType Load (0.7ms) SELECT "project_types".* FROM "project_types" WHERE "project_types"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
ProjectGroup Create (0.4ms) INSERT INTO "project_groups" ("name", "ProjectType_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) RETURNING "id" [["name", "something"], ["ProjectType_id", 1], ["created_at", "2024-06-01 03:03:05.944403"], ["updated_at", "2024-06-01 03:03:05.944403"]]
TRANSACTION (0.1ms) rollback transaction
(irb):10:in `<main>': SQLite3::SQLException: no such table: main.ProjectTypes (ActiveRecord::StatementInvalid)
и если у вас есть ProjectType только с идентификатором 1, вы не сможете создать что-то с project_type_id == 2
вам придется использовать случай со змеей: bin/rails g model project_group project_type:references ...
. я предполагаю, что ты это сделал ProjectType:references
вместо этого.
@Алекс, я думаю, что можно было бы использовать bigint - так что это было сделано вручную...
@max пришлось дважды проверить, в sqlite нет bigint.
@Алекс, ты прав.
Причина, по которой вы получаете сообщение об ошибке, заключается в том, что таблица имеет имя project_types
, а не ProjectTypes
. Что касается схемы, в Rails все должно быть в нижнем регистре.
Чтобы добавить столбец внешнего ключа в таблицу, используйте метод add_reference
:
class AddProjectTypeToProjectGroups < ActiveRecord::Migration[7.1]
def change
add_reference :project_groups, :project_type,
null: false,
foreign_key: true
end
end
Или в форме блока с помощью ActiveRecord::ConnectionAdapters::TableDefinition:
class AddProjectTypeToProjectGroups < ActiveRecord::Migration[7.1]
def change
change_table :project_groups do |t|
t.references :project_type,
null: false,
foreign_key: true
end
end
end
Вторым аргументом должна быть версия имени модели в единственном числе в змеевидном регистре. Это присвоит столбцу внешнего ключа имя в соответствии с соглашениями Rails:
Эти поля должны быть названы по образцу сингуляризованное_имя_таблицы_id (например, item_id, order_id). Эти поля, которые Active Record будет искать при создании ассоциаций между вашими моделями.
В этом случае столбец должен называться project_type_id
.
В общем, с Rails вы получите гораздо больше удовольствия и меньше хлопот, если обратите внимание на его соглашения об именах.
у вас ужасное именование переменных, должно быть
ProjectType_id
->project_type_id
, и введите для такого столбца не целое число - оно должно быть bigint