Обычно я знаю, что belongs_to
связывает модели вместе на основе столбца id
, но в моем случае я хочу связать его с помощью столбца token
.
Например:
#app/models/user.rb
class User < ApplicationRecord
has_many :test_results
end
и
#app/models/test_result.rb
class TestResult < ApplicationRecord
belongs_to :user
end
Модель User
имеет столбец с именем token
, и поэтому, когда я создаю новую запись в TestResult
, которая имеет тот же token
, что и в User
, я хочу, чтобы TestResult
быть связанным с этим User
.
Я пробовал это в форме модели:
#app/models/test_result.rb
class TestResult < ApplicationRecord
belongs_to :user, foreign_key: "token"
end
но когда я создаю новый результат теста, я вижу, что ActiveRecord все еще ищет поле id
, которое соответствует, вместо token
.
2.5.1 :001 > TestResult.create(token: "Hello")
(6.2ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
(0.2ms) BEGIN
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 0 LIMIT 1
(0.2ms) ROLLBACK
=> #<TestResult id: nil, token: "Hello", created_at: nil, updated_at: nil>
Вот как выглядят мои файлы миграции:
class TestResults < ActiveRecord::Migration[5.1]
def change
create_table :test_results do |t|
t.string :token
t.timestamps
end
end
end
и
class User < ActiveRecord::Migration[5.1]
def change
create_table :users do |t|
t.belongs_to :company, foreign_key: true
t.belongs_to :platform, foreign_key: true
t.string :token
t.timestamps
end
end
end
Я знаю, что использую foreign_key
неправильно, но я не знаю, как.