ruby-on-rails - 活动记录外键主键问题
问题描述
假设我有两个表,它们由自定义列链接:
table1s
id varchar
user_id varchar
table2s
id varchar
linked_user_id varchar
现在,我尝试在 Ruby 代码中建立关系
class Table1 < ActiveRecord::Base
self.primary_key = "id"
has_many :table2s, primary_key: :user_id, inverse_of: :table1
end
class Table2 < ActiveRecord::Base
self.primary_key = "id"
belongs_to :table1, foreign_key: :linked_user_id, inverse_of: :table2s
end
现在,当我尝试进行 SQL 查询时,它出于某种原因使用id
列而不是指定的user_id
Table2.select('table2s.*')
.joins(:table1)
.where('table1s.id = ?', 323235)
生成的 SQL 如下所示:
SELECT table2s.*
FROM table2s
INNER JOIN table1s ON table1s.id = table2s.linked_user_id
WHERE table1s.id = 323235
我期待它user_id
不是id
:
SELECT table2s.*
FROM table2s
INNER JOIN table1s ON table1s.user_id = table2s.linked_user_id
WHERE table1s.id = 323235
有什么想法吗?
解决方案
如果您有一个自定义关系,其中键与primary_key
类(表)的键不同,那么您需要将两者都添加foreign_key
到primary_key
关系中,以使连接正常工作。例如
class Table1 < ActiveRecord::Base
self.primary_key = "id"
has_many :table2s, primary_key: :user_id, foreign_key: :linked_user_id, inverse_of: :table1
end
class Table2 < ActiveRecord::Base
self.primary_key = "id"
belongs_to :table1, primary_key: :user_id, foreign_key: :linked_user_id, inverse_of: :table2s
end
belongs_to
从文档
:primary_key 指定返回用于关联的关联对象的主键的方法。默认情况下,这是 id。
has_many
从文档
:foreign_key 指定用于关联的外键。默认情况下,这被猜测为带有“_id”后缀的关联名称。所以定义了belongs_to :person 关联的类将使用“person_id”作为默认的:foreign_key。同样,belongs_to :favorite_person, class_name: "Person" 将使用外键“favorite_person_id”。
推荐阅读
- python - 如何使用 Python(在 Windows 上)从 Flirc USB(HID 设备)捕获事件?
- angular - 如何防止用户在未填写所有必需填写的情况下进行下一步?
- javascript - 当我缩放到太东的范围时地图崩溃
- laravel - Laravel - 雄辩的关系 - 多对多 - 获取中间表列
- django - 即使 print() 函数在终端中返回 False,Django REST API 中的自定义权限也不会引发任何错误
- pine-script - 声明变量时出现未识别标识符错误
- unit-testing - 在单元测试数据库中为 FLASK sqlalchemy 应用程序添加一行
- javascript - 在 window.addEventListener 中更新 React 状态
- java - 通过替换隐藏的“#”数字符号生成所有可能的字符串组合
- php - jsonb字段内的postgres更新键