RoRails ~ 5: ассоциации с пользовательскими именами db-полей - PullRequest
0 голосов
/ 01 февраля 2019

Этот вопрос обсуждался много раз, однако я столкнулся с проблемой, на которую я не смог найти ответ.

Я строю систему входа в систему, где один член (: 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

Логика:

  1. Когда член m регистрируется, m должен ссылаться на участникап по имени.m.bail равен nil / null, и создается BailRequest br с br.member = n и br.candidate = m
  2. Если член принимает залог, для br.accepted устанавливается значение true.m.bail установлен в n, а m в n.associates

1 Ответ

0 голосов
/ 02 февраля 2019

В файле миграции я изменил

t.references :candidate, index: {:unique=>true}

на

t.integer :candidate_id, index: {:unique=>true}, foreign_key: true

и перезапустил миграцию.Сейчас на рельсах работает консоль.Спасибо arieljuod за ваши усилия.

...