这个问题被讨论了很多次,但是我遇到了一个我找不到答案的问题。
我正在构建一个登录系统,其中一个 Member(:class) “保释”一个新成员。在内部,他们分别被称为“成员”和“候选人”。在成员接受保释之前,BailRequest(:class) 会列在相应的表中。
根据rails指南,告诉rails所指类的正确方法是
class BailRequest < ApplicationRecord
belongs_to :candidate, class_name: "Member"
belongs_to :member
end
其中 class_name: "Member" 应该告诉 rails BailRequest.candidate 属于 class: 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: no such table: main.candidates。
看起来 ActiveRecord 在这里期待一个名为“candidates”的表。我错过了什么?
$ 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 并且使用 br.member = n 和 br.candidate = m 创建 BailRequest br
- 如果成员接受保释,则 br.accepted 设置为 true。m.bail 设置为 n 并且 m 在 n.associates 中