RoRails~5: ассоциации с пользовательскими именами db-полей
Этот вопрос обсуждался много раз, однако я столкнулся с проблемой, на которую не смог найти ответ.
Я создаю систему входа в систему, в которой один участник (:class) "спасает" нового участника. Внутренне они упоминаются как "член" и "кандидат" соответственно. Пока участник не принял поручительство, BailRequest(:class) указан в соответствующей таблице.
Согласно руководству по рельсам, правильный способ рассказать рельсам о классе, к которому он обращается,
class BailRequest < ApplicationRecord
belongs_to :candidate, class_name: "Member"
belongs_to :member
end
где class_name: "Member" должен сообщить рельсам, что BailRequest.candidate относится к классу: Member. Тот же самый подход работал в классе участников без нареканий
class Member < ApplicationRecord
belongs_to :bail, class_name: "Member", optional: true
has_many :associates, class_name: "Member", foreign_key: "bail_id"
end
Однако на этот раз, когда я хочу сохранить BailRequest в базе данных, я получаю ActiveRecord::StatementInvalid: SQLite3::SQLException: нет такой таблицы: main.candidates.
Похоже, ActiveRecord ожидает здесь таблицу с именем "кандидатов". Что мне не хватает?
$ rails -v
Rails 5.2.1
[$ ruby -v
ruby 2.3.1p112 (2016-04-26) [i386-linux-gnu]]
Schema.rb показывает следующее после миграции
create_table "bail_requests", force: :cascade do |t|
t.integer "candidate_id"
t.integer "member_id"
t.string "message", limit: 100
t.boolean "accepted"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["candidate_id"], name: "index_bail_requests_on_candidate_id", unique: true
t.index ["member_id"], name: "index_bail_requests_on_member_id"
end
create_table "members", force: :cascade do |t|
t.string "email", limit: 50, null: false
t.string "password_digest", null: false
t.integer "bail_id"
t.string "username", limit: 50
t.string "first_name", limit: 50
t.string "last_name", limit: 50
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["email"], name: "index_members_on_email", unique: true
t.index ["username"], name: "index_members_on_username", unique: true
end
Логика:
- Когда член m регистрируется, m должен ссылаться на члена n по имени. m.bail равен nil / null, и создается BailRequest br с br.member = n и br.candidate = m
- Если участник принимает залог, для br.accepted установлено значение true. m.bail установлен в n и m находится в n.associates
1 ответ
В файле миграции я изменил
t.references :candidate, index: {:unique=>true}
в
t.integer :candidate_id, index: {:unique=>true}, foreign_key: true
и перезапустите миграцию. Сейчас на рельсах работает консоль. Спасибо arieljuod за ваши усилия.