Впервые пытаюсь использовать внешний ключ, отличный от model_id в Rails - PullRequest
0 голосов
/ 10 сентября 2018

Обычно я знаю, что 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 неправильно, но я не знаю, как.

1 Ответ

0 голосов
/ 10 сентября 2018

Не уверен, что это лучшее решение, но просто добавление функции primary_key к модели TestResult в моем случае сработало.

#app/models/test_result.rb
class TestResult < ApplicationRecord
   belongs_to :user, foreign_key: "token", primary_key: "token"
end
...