Да, вы должны передать указатель на указатель. C передает аргументы по значению, а не по ссылке.
Ограничения базы данных не требуются больше, чем ремни безопасности в вашем автомобиле. Вы можете ездить сколько угодно, и все будет отлично работать, пока не возникнет проблема. Ремень безопасности (ограничения) сохранит вас (данные) в безопасности.
Поэтому настоятельно рекомендуется создать ограничения для обеспечения целостности данных на уровне базы данных, потому что весьма вероятно, что 1) вы будете взаимодействовать с базой данных в какой-то момент вне Rails и 2) вы сделаете ошибку в своем код, вызывающий недопустимые данные.
Ограничения базы данных могут потребовать больше работы, но это экономит много работы, особенно когда ваш код может делать предположения о данных и не должен выполнять множество проверок достоверности.
Причина, по которой ActiveRecord не поддерживает внешние ключи "из коробки", состоит в том, что он не зависит от базы данных, а внешние ключи не поддерживаются всеми системами баз данных.
Вы можете добавить поддержку внешнего ключа с помощью плагина Foreigner .
Не все базы данных, поддерживаемые ActiveRecord, поддерживают внешние ключи, поэтому инфраструктура Rails не включает их в качестве основной функции.
Примечание: приведенное выше уже не является точным, поскольку Rails добавил поддержку FK в 4.2.