在Rails中使用自定义属性作为外键



我们有两个相关的模型,QuestionAnswer

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

外键值和主键值可以指定为字符串或符号。

相关内容

  • 没有找到相关文章

最新更新