Как мне связать таблицу в rails с уже существующими таблицами
Я пишу плагин на Rails для Redmine (дипломная работа). Я хочу создать свою таблицу задач, у которой был бы свой id, при этом она содержала бы в себе некоторые необходимые мне данные из других таблиц, пытаюсь я это сделать через существующую таблицу задач issues. Мне нужен номер задачи, проект, юзер - которому назначена задача, трекер, статус, тема.
Я понимаю, что у меня неправильно, так как миграция проходит безуспешно. Как мне лучше подойти к решению этой проблемы?
Моя модель
class Task < ActiveRecord::Base
unlodable
has_one :issue
has_one :project, through: :issue
has_one :traker, through: :issue
has_one :assigned_to, through: :issue
has_one :subject, through: :issue
has_one :status, through: :issue
end
Мой файл миграции
class CreateTasks < ActiveRecord::Migration[5.2]
def change
create_table :tasks do |t|
t.integer :issue_id
t.string :issue_project
t.string :issue_assigned_to
t.string :issue_status
t.string :issue_subject
end
end
end
Таблица issues в схеме Redmine
create_table "issues", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci", force: :cascade do |t|
t.integer "tracker_id", null: false
t.integer "project_id", null: false
t.string "subject", default: "", null: false
t.text "description", limit: 4294967295
t.date "due_date"
t.integer "category_id"
t.integer "status_id", null: false
t.integer "assigned_to_id"
t.integer "priority_id", null: false
t.integer "fixed_version_id"
t.integer "author_id", null: false
t.integer "lock_version", default: 0, null: false
t.timestamp "created_on"
t.timestamp "updated_on"
t.date "start_date"
t.integer "done_ratio", default: 0, null: false
t.float "estimated_hours"
t.integer "parent_id"
t.integer "root_id"
t.integer "lft"
t.integer "rgt"
t.boolean "is_private", default: false, null: false
t.datetime "closed_on"
t.index ["assigned_to_id"], name: "index_issues_on_assigned_to_id"
t.index ["author_id"], name: "index_issues_on_author_id"
t.index ["category_id"], name: "index_issues_on_category_id"
t.index ["created_on"], name: "index_issues_on_created_on"
t.index ["fixed_version_id"], name: "index_issues_on_fixed_version_id"
t.index ["parent_id"], name: "index_issues_on_parent_id"
t.index ["priority_id"], name: "index_issues_on_priority_id"
t.index ["project_id"], name: "issues_project_id"
t.index ["root_id", "lft", "rgt"], name: "index_issues_on_root_id_and_lft_and_rgt"
t.index ["status_id"], name: "index_issues_on_status_id"
t.index ["tracker_id"], name: "index_issues_on_tracker_id"
end
Последнее изменение в файле миграции
class CreateTasks < ActiveRecord::Migration[5.2]
create_join_table :tasks, :issues, :projects, :trackers, :status do |t|
t.integer :issue_id
t.string :project_name
t.string :issue_assigned_to_id
t.string :traker_name
t.string :status_name
t.string :issue_subject
end
end
Ответы (1 шт):
Таблица tasks совершенно правильно хранит issue_id. Это говорит о том, что связь должна быть belongs_to :issue, а не has_one. Все остальные поля в tasks не нужны, эти данные вы можете получить через связи
class CreateTasks < ActiveRecord::Migration[5.2]
def change
create_table :tasks do |t|
t.integer :issue_id
end
end
end
class Task < ActiveRecord::Base
unlodable
belongs_to :issue
has_one :project, through: :issue
has_one :traker, through: :issue
has_one :assigned_to, through: :issue
has_one :subject, through: :issue
has_one :status, through: :issue
end