Определение has_one с другим внешним ключом - PullRequest
0 голосов
/ 23 октября 2018

У меня есть две модели Rails, Hub и Advisor.A Hub has_many Advisor s примерно так:

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

Идентификатор концентратора не устанавливается.Что дает?

Структура таблицы таблицы 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)

1 Ответ

0 голосов
/ 23 октября 2018

Поскольку в концентратор добавляется manager_id, ссылка на Advisor, поэтому ассоциация должна быть такой: -

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...