Rails ассоциации логики против кода - PullRequest
0 голосов
/ 18 апреля 2020

Я сейчас создаю свое первое приложение с Ruby на Rails (версия 5.2.4.2 с ruby 2.6.3) и у меня проблема с одной из ассоциаций. В моей модели есть приложения, в которых вы предоставляете одну компанию, к которой вы обращаетесь. Логически я хотел бы иметь возможность получить приложение и сказать: application.company = Company.find_by(...).

. Чтобы сделать эту работу, у меня есть

# app/models/Application.rb
class Application < ApplicationRecord
  has_one: company
end

# app/models/Company.rb
class Company < ApplicationRecord
end

# database migration
Class AddCompanyToApplication
  def change
    add_reference :companies, :application, foreign_key: true
  end
end

. Это позволяет мне использовать нужный синтаксис, но имеет одна проблема. Когда я создаю второе приложение для той же компании, изменяется строка в таблице компаний, которая удаляет компанию из первого приложения.

Список компаний задан заранее, и я просто хочу обратиться к компании из приложения. Есть ли способ использовать синтаксис присваивания при размещении внешнего ключа в приложении, а не в компании? С точки зрения базы данных я чувствую, что приложение должно содержать внешний ключ, но это нарушает синтаксис присваивания. Похоже, что Ruby хочет, чтобы у меня в компании были has_many: приложения, но это нарушает семантику того, что я пытаюсь выполнить sh. Есть ли способ изменить размещение внешнего ключа или мне нужно для go синтаксиса присваивания и придерживаться SQL и присвоения непосредственно идентификаторам?

1 Ответ

0 голосов
/ 18 апреля 2020

Прямо сейчас у вас есть отношения 1 к 1. Приложение has_one :company и компания belongs_to :application. Вот почему, когда вы пытаетесь создать второе приложение для той же компании, application_id в таблице компаний переопределяется. Если вы измените ассоциацию своей компании на has_many :applications, вы сможете добавить более одной заявки в компанию. Затем вы можете позвонить application.company, чтобы вернуть текущую компанию приложения, или application.company = ..., чтобы назначить компанию для текущего приложения.

class Application < ApplicationRecord
  has_one :company
end

class Company < ApplicationRecord
  has_many :applications
end

Чтобы выполнить эту работу, вы должны создать новую миграцию:

Class AddCompanyIdToApplication
  def change
    add_reference :application, :company, foreign_key: true
  end
end

Прежде чем сделать это, вы должны откатить существующую миграцию AddCompanyToApplication (кстати, она названа неверно, потому что вы не добавляете компанию в приложение, а добавляете приложение в компания) и удалите миграцию AddCompanyToApplication.

Подробнее о ассоциациях

Подробнее о add_reference

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...