ruby-on-rails - 用不同的外键定义 has_one
问题描述
我有两个 Rails 模型,Hub
和Advisor
. 一个Hub
has_manyAdvisor
就像这样:
class Hub < ApplicationRecord
has_many :advisors
end
我想设置一个特别Advisor
的人作为该中心的经理。我已经manager_id
像这样向集线器添加了一个:
class AddManagerToHub < ActiveRecord::Migration[5.1]
def change
change_table :hubs do |t|
t.references :manager, references: :advisors
end
end
end
但我无法弄清楚在模型中设置这种关系的正确咒语。逻辑会规定它应该是:
has_one :manager, class_name: 'Advisor', primary_key: :manager_id
但是当我这样保存时:
hub.manager = advisor
hub.save
集线器 ID 未设置。是什么赋予了?
Hubs表的表结构为:
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
------------------+---------------------+-----------+----------+----------------------------------+----------+--------------+-------------
id | bigint | | not null | nextval('hubs_id_seq'::regclass) | plain | |
name | character varying | | | | extended | |
address_line_1 | character varying | | | | extended | |
address_line_2 | character varying | | | | extended | |
postcode | character varying | | | | extended | |
longitude | double precision | | | | plain | |
latitude | double precision | | | | plain | |
ward_mapit_codes | character varying[] | | | '{}'::character varying[] | extended | |
manager_id | bigint | | | | plain | |
Indexes:
"hubs_pkey" PRIMARY KEY, btree (id)
"index_hubs_on_manager_id" btree (manager_id)
Referenced by:
TABLE "advisors" CONSTRAINT "fk_rails_d86df62174" FOREIGN KEY (hub_id) REFERENCES hubs(id)
解决方案
由于manager_id
在集线器中添加了对Advisor
so 关联的引用应该是这样的:-
class Hub < ApplicationRecord
has_many :advisors
belongs_to :hub_manager, class_name => "Advisor", :foreign_key => "manager_id", optional: true
end
class Advisor < ApplicationRecord
belongs_to :hub
has_many :owned_hubs, class_name => "Hub", :foreign_key => "manager_id",
end
查询将如下所示: -
hub.hub_manager = advisor
hub.save
推荐阅读
- sql - 将表条目从一个数据库传输到另一个数据库
- python - 总结字典内列表中相同键的值?
- javascript - JS画布显示在页面底部
- google-apps-script - 谷歌表覆盖现有数据库
- leaflet - 打开街道地图默认图块(传单)
- javascript - React - 在同一选项卡中打开一个链接,然后单击新链接中的一个按钮
- c# - EF Core await ToArrayAsync() 在 DbContext 中不起作用
- python - 在 azure webjobs 中的多个文件中运行一个文件
- google-sheets - 如何解决在任何情况下出现的“禁用登录”?
- java - 初始 java 下载是否必须与我下载的后续 jdks 位于同一文件中?