RoRails〜5:使用自定义数据库字段名关联

时间:2019-02-01 19:19:53

标签: ruby-on-rails associations customcolumn

这个问题被讨论了很多次,但是我遇到了一个我找不到答案的问题。

我正在构建一个登录系统,其中一个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:没有这样的表: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

逻辑:

  1. 当成员m注册时,m必须按名称引用成员n。 m.bail等于nil / null并使用以下命令创建BailRequest br br.member = n和br.candidate = m
  2. 如果成员接受保释,则br.accepted设置为true。 m.bail设置为n,m在n.associates中

1 个答案:

答案 0 :(得分:0)

在迁移文件中,我更改了

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

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

,然后重新运行迁移。现在,它正在Rails控制台上工作。感谢arieljuod的努力。