在Rails中使用自定义属性作为外键[重复]

Posted

技术标签:

【中文标题】在Rails中使用自定义属性作为外键[重复]【英文标题】:Using Custom Attribute as Foreign Key in Rails [duplicate] 【发布时间】:2022-01-19 08:50:07 【问题描述】:

我们有两个模型,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 的主键的情况下设置这个东西(如here 解释的那样)?我显然可以覆盖默认的关联方法(question.answer、answer.question),但我真的不想这样做。

【问题讨论】:

【参考方案1】:

解决方案其实很简单(使用this post):

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

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

【讨论】:

以上是关于在Rails中使用自定义属性作为外键[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Rails 为表单使用自定义字符串标签

是否可以使用自定义方法/属性覆盖外键关系

Swift中自定义对象和自定义对象数组的通用属性[重复]

使用自定义列名映射外键

Rails 中的自定义命名属性

Rails 中的自定义字段作为未来条目的模板