我们有两个相关的模型,Question
和Answer
:
class Question < ApplicationRecord
has_one :answer
end
class Answer < ApplicationRecord
belongs_to: question
end
在默认设置下,answers
表包含用于此关系的question_id
列。本专栏自动列举了问题(question.id
(,但在迁移一些旧数据集时,它给我们带来了一些挑战。
每个问题都有一个额外的唯一标识符name
,它是一个字符串:
<Question id: 355, name: "ABC123", question_type: ...>
我们希望使用此属性作为此关联的密钥。也就是说,answers
表应该包含一个question_name
列,该列将保存相关值。我们已经成功地设置了自定义列名并正确地定义了外键,但它总是查找question_id
值而不是名称。使用上面的示例,它将查找外键为355
而不是"ABC123"
的行。
有没有什么方法可以在不更改question
的主键的情况下设置这个东西(如这里所解释的(?很明显,我可以覆盖默认的关联方法(question.answer,answer.equestion(,但我真的不想这样做。
解决方案实际上非常简单(使用本文(:
class Question < ApplicationRecord
has_one :answer, foreign_key: "question_name", primary_key: "name"
end
class Answer < ApplicationRecord
belongs_to :question, foreign_key: "question_name", primary_key: "name"
end
外键值和主键值可以指定为字符串或符号。