【问题标题】:Add nullable foreign key in Rails在 Rails 中添加可为空的外键
【发布时间】:2014-12-21 12:34:57
【问题描述】:

参考 Rails 4.2 add_foreign_key 支持:

    # add a foreign key to `articles.author_id` referencing `authors.id`
    add_foreign_key :articles, :authors

如何创建一个可为空的外键约束,以允许articles.author_id有时为空的情况?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord ruby-on-rails-4.2


    【解决方案1】:

    注意在Rails 5中在Rails 6中你可能需要将对应的关联标记为可选,如果它是1:n (belongs_to),作为默认值已更改:

    belongs_to :author, optional: true

    这是对应的Changeset

    要在您的应用程序中使用旧行为,您还可以设置:

    Rails.application.config.active_record.belongs_to_required_by_default = false
    

    config/initializers/new_framework_defaults.rb

    你通常会看到的错误是:

    ActiveRecord::RecordInvalid: Validation failed: Class must exist
        from /usr/local/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/validations.rb:78:in `raise_validation_error'
    

    您可能还需要更新任何迁移:将 null: false 更改为 true 并运行 rake db:redo(如果已运行)。

    【讨论】:

      【解决方案2】:

      article 模型中添加optional: truebelongs_to :author 即可完成这项工作。

      【讨论】:

      • 这仅适用于 mongoid... 只是遇到了同样的问题,但使用 pg。不幸的是,这不起作用。
      • 以上行直接取自我在 PG 上运行的应用程序。在使用 Postgres 时,我没有遇到任何此类问题。
      • 确认@RajanVerma-Aarvy 是正确的;这在 postgres db 上对我有用。
      【解决方案3】:

      指南中没有任何内容暗示add_foreign_key 会使相应的外部字段“NOT NULL”或必需。 add_foreign_key 只需添加一个外键约束,无论该​​字段是否必需(在您的情况下,author_idarticles 中)。

      您在迁移中尝试此操作时是否遇到错误?

      这是它将生成的 SQL:

      ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id")
      

      所以,如果在 articles 的原始迁移中,author_id 为空,那么您可以拥有可为空的外键。

      【讨论】:

      • 我相信这对于 Rails 4 及以下版本是准确的,对吗?
      猜你喜欢
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多