外键允许为NULL?

时间:2015-05-20 13:42:40

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

我有一个表必须有一个有效且存在的case_id,并且除非它存在,否则不应创建该记录。我不应该传递NULL case_id。

看起来像:

# == Schema Information
#
# Table name: medical_intervention_expert_answers
#
#  id                      :integer          not null, primary key
#  case_id                 :integer
#  problem_id              :integer
#  medical_intervention_id :integer
#  created_at              :datetime
#  updated_at              :datetime
#  pti                     :boolean
#

class MedicalInterventionExpertAnswer < ActiveRecord::Base
    belongs_to :case
    belongs_to :problem
    belongs_to :medical_intervention

    def self.create_from_data(case_id, problem_id, medical_intervention_id, is_pti)
        answer = self.create(case_id: case_id, problem_id: problem_id, medical_intervention_id: medical_intervention_id, 
            pti: is_pti)

        return answer
    end
end

如果我传入一个null_的case_id或者传入一个不存在的case_id,那么'answer'变量应该是nil而数据库应该是未修改的。

我必须做些什么来建立这种关系?

2 个答案:

答案 0 :(得分:2)

对于添加外键,首先添加表的名称(不是模型名称),这是第一个参数,第二个参数是外表的名称(不是模型名称)。 作为第一个参数的表应该具有一个具有特定名称的列,如下所示:name_foreign_model_id。 例: 国外模特

class CreateGrades < ActiveRecord::Migration
  def change
    create_table :grades do |t|
      t.string :name, limit: 20
      t.integer :level, limit: 2
      t.string :next, limit: 20

      t.timestamps null: false
    end
  end
end

class CreateGoals < ActiveRecord::Migration
  def change
    create_table :goals do |t|
      t.integer :dimension, limit: 2, null: false
    **t.integer :grade_id, null: false**
      t.string :description, limit: 1024, null: false

      t.timestamps null: false
    end
    **add_foreign_key :goals, :grades**
  end
end

您也可以在单独的迁移中添加外键。

有了这个,就不应该接受null外键。

答案 1 :(得分:1)

通过

在迁移中添加外键约束
p

有关详细信息,请参阅ActiveRecord::Migration guide