Можно ли использовать объединенную таблицу в качестве основы для модели? - PullRequest
0 голосов
/ 17 января 2019

Какие есть варианты для литья существующих таблиц базы данных с моей моделью в рельсах? У меня есть отношение has_one и own_to между двумя таблицами, но я хотел бы объединить их и использовать их в качестве модели (и выбирать только соответствующие поля). Поскольку это внешняя таблица, я бы также хотел минимизировать количество запросов.

Я унаследовал существующее приложение и хотел бы ничего не трогать из существующей среды и медленно мигрировать. Кажется, что существующая база данных была сделана не так, как рельсы. У меня есть модель IdCard и IdCardRequest. Можно предположить, что одна IdCard имеет много IdCardRequest, однако IdCard имеет свойство для последнего IdCardRequest. Похоже, что базовая информация, такая как имя_кандидата, является свойством запроса IdCardRequest, а не IdCard. К счастью, они оба имеют общее свойство id_card_number, и я могу присоединиться к нему, основываясь на этом, указав foreign_key и primary_key для id_card_number. Однако сейчас я бы хотел модель IdCard с остальными полями IdCardRequest в качестве свойства.

    class IdCard < ExternalTable
      self.table_name = 'id_cards'
      belongs_to :security_id_request, :foreign_key => 'request_id'
      default_scope { includes(:id_request) }
    end
    class IdRequest < ExternalTable
      self.table_name = 'id_request'
      has_one :id_card, :foreign_key => 'request_id'
    end
    # I would like IdCard.first.applicant_lastname
    # I have to call IdCard.first.id_request.applicant_lastname
    # I have to call IdCard.first.id_request.applicant_firstname
    # I could write a delegate_to for every property, but this seems cumbersome and inefficient.

1 Ответ

0 голосов
/ 17 января 2019

Есть ли у вас возможность создать представление базы данных, которое инкапсулирует обе таблицы и переименовывает столбцы в соглашения rails?

например.

create view id_card_requests as 
select 
  existing_column as desired_rails_column_name,
  ... 
from id_cards 
join id_card_requests on <whatever the join is>

Затем вы можете сделать модель рельсов IdCardRequests, которая будет работать как обычно. Вы можете сделать один из столбцов первичным ключом в представлении или указать модели использовать один из столбцов с self.primary_key = :my_key_column

...