Rails 5

时间:2017-05-11 12:21:24

标签: postgresql sqlite activerecord ruby-on-rails-5 belongs-to

我的应用有两种型号:ServiceUser。服务可能拥有并分配了驱动程序。我已将其实现为:

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。

我想知道如何修改我的模型或迁移以避免此异常。有什么想法吗?

非常感谢你。

1 个答案:

答案 0 :(得分:0)

对不起。我刚刚意识到了解决方案。我没有说的是我使用select元素输入驱动程序。由于驱动程序是可选的,我添加了&#34;空&#34;使用:

<option value="0"></option>

更改为:

<option value=""></option>

解决了这个问题。

我更愿意删除这个问题,因为它没有提供任何价值。