我的应用有两种型号:Service
和User
。服务可能拥有并分配了驱动程序。我已将其实现为:
class User < ApplicationRecord
end
和
class Service < ApplicationRecord
has_and_belongs_to_many :users
belongs_to :driver, class_name: "User", optional: true
end
请注意,由于特定服务可能有也可能没有驱动程序,因此我将关联标记为optional
。我没有从User
模型到Service
的任何指针。
我有以下迁移实现此关联:
class AddOPtionalDriverToService < ActiveRecord::Migration[5.0]
def change
add_reference :services, :driver, references: :users, index: true
add_foreign_key :services, :users, column: :driver_id
end
end
运行迁移时,我的架构的相关部分是:
create_table "services", force: :cascade do |t|
t.string "destination"
....
t.text "comments"
t.index ["driver_id"], name: "index_tdy_requests_on_driver_id", using: :btree
end
...
add_foreign_key "tdy_requests", "users", column: "driver_id"
end
我的问题是,当我尝试创建没有驱动程序的新服务时,params
包含驱动程序的值"0"
:
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"kVC53huZYZxuF4akSiqkGkSvoo5p2f4dQ==",
"service"=>{
"destination"=>"Some where", ... ,
"driver_id"=>"0",
"comments"=>""},
"commit"=>"Create Service"}
但由于driver_id为“0”,我得到以下异常:
PG::ForeignKeyViolation: ERROR: insert or update on
table "services" violates foreign key constraint
"fk_rails_15497e1c36" DETAIL: Key (driver_id)=(0) is
not present in table "users"
这很有意义,但有趣的是,当我从SQLite迁移到PostgreSQL时,我发现了这一点,因为它与SQLite的工作正常。至少应用程序正在做我想做的事情。我正在使用Rail 5.0.2。
我想知道如何修改我的模型或迁移以避免此异常。有什么想法吗?
非常感谢你。
答案 0 :(得分:0)
对不起。我刚刚意识到了解决方案。我没有说的是我使用select元素输入驱动程序。由于驱动程序是可选的,我添加了&#34;空&#34;使用:
<option value="0"></option>
更改为:
<option value=""></option>
解决了这个问题。
我更愿意删除这个问题,因为它没有提供任何价值。