首页 > 解决方案 > 活动记录外键主键问题

问题描述

假设我有两个表,它们由自定义列链接:

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

有什么想法吗?

标签: ruby-on-railsactiverecordruby-on-rails-5

解决方案


如果您有一个自定义关系,其中键与primary_key类(表)的键不同,那么您需要将两者都添加foreign_keyprimary_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”。


推荐阅读