第一次尝试在Rails中使用除model_id以外的外键

时间:2018-09-09 21:44:17

标签: ruby-on-rails rails-activerecord

因此,我通常知道,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中创建一个新条目时,该条目与{{1 }},我希望将token与该User关联。

我以模型形式尝试过:

TestResult

但是当我创建一个新的测试结果时,我可以看到ActiveRecord仍在寻找匹配的User字段,而不是#app/models/test_result.rb class TestResult < ApplicationRecord belongs_to :user, foreign_key: "token" end

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 ,但是我不确定如何使用。

1 个答案:

答案 0 :(得分:1)

不确定这是否是最好的解决方案,但在我的案例中,仅将primary_key函数添加到TestResult模型中即可。

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