Rails 使用非 id 列进行模型关联
Rails use a non-id column for model associations
如何为 Rails 模型关联指定一个列作为它的 foreign_key?这是默认的"id",我想指定另一列。
示例:
question.rb
class Question < ActiveRecord::Base
has_many :answers
end
answer.rb
class Answer < ActiveRecord::Base
belongs_to :question
end
"questions" 和 "answers" table 都不使用 id 列。相反,他们都使用 stack_overflow_id 列作为他们的 primary_keys(他们来自 Whosebug API)。
这是应该能够 运行:
的代码
my_question = Question.find(stack_overflow_id: 55)
answers = my_question.answers
这是两个功能:
- 正在覆盖关联的外键。这是通过关联的
foreign_key
参数完成的:belongs_to :question, foreign_key: "stack_overflow_id"
。这将允许您执行 instance.association
并取回正确的记录。
- 通过参数查找记录,而不是自动创建的 ID 字段。这是使用
Model.where(stack_overflow_id: 55)
(对于多个记录)或使用 find_by(stack_overflow_id: 55)
(对于具有该 ID 的 first/only 记录)完成的。检查这些命令的 APIs,因为它们与 find
. 的 API 不匹配
如何为 Rails 模型关联指定一个列作为它的 foreign_key?这是默认的"id",我想指定另一列。
示例:
question.rb
class Question < ActiveRecord::Base
has_many :answers
end
answer.rb
class Answer < ActiveRecord::Base
belongs_to :question
end
"questions" 和 "answers" table 都不使用 id 列。相反,他们都使用 stack_overflow_id 列作为他们的 primary_keys(他们来自 Whosebug API)。
这是应该能够 运行:
的代码my_question = Question.find(stack_overflow_id: 55)
answers = my_question.answers
这是两个功能:
- 正在覆盖关联的外键。这是通过关联的
foreign_key
参数完成的:belongs_to :question, foreign_key: "stack_overflow_id"
。这将允许您执行instance.association
并取回正确的记录。 - 通过参数查找记录,而不是自动创建的 ID 字段。这是使用
Model.where(stack_overflow_id: 55)
(对于多个记录)或使用find_by(stack_overflow_id: 55)
(对于具有该 ID 的 first/only 记录)完成的。检查这些命令的 APIs,因为它们与find
. 的 API 不匹配