2015-05-20 5 views
2

У меня есть таблица, которая ДОЛЖНА иметь case_id, которая действительна и существует, и запись не должна создаваться, если она не существует. Я не смог бы передать NULL case_id.Внешним ключом может быть NULL?

Это выглядит следующим образом:

# == 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 

Если я прохожу в case_id, который нулевой или передать в case_id, который не существует, переменная «ответ» должен быть нулевым, а база данных должна быть неизмененными.

Что мне делать, чтобы иметь такое отношение?

ответ

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 

Также вы можете добавить внешний ключ в отдельной миграции.

При этом не следует принимать нулевой внешний ключ.

+0

Проблема заключается в том, что я использую SQLite, поэтому я не могу использовать add_foreign_key – jmasterx

+0

. Прежде чем отправлять medical_intervention_id, я проверяюсь. – cristiancvanega

1

Добавить ограничение внешнего ключа в вашей миграции через

add_foreign_key :table, :column 

Смотрите ActiveRecord::Migration guide для получения дополнительной информации.

Смежные вопросы