Какой самый сухой способ реализовать множественное наследование таблиц в рельсах? - PullRequest
0 голосов
/ 20 мая 2019

У меня есть несколько таблиц в моем приложении, которые разделяют большинство столбцов, я написал все проверки в одной модели и попытался сделать так, чтобы все другие модели наследовали от этой, но получил ошибку ActiveRecord::SublassNotFound.

Вот коды для моих моделей:

hospial.rb

class Hospital < ActiveRecord::Base

    validates :cnes, presence: true, numericality: true
    validates :name, presence: true, length: { maximum: 80 }
    validates :address, presence: true, length: { maximum: 50 }
    validates :neighborhood, presence: true, length: { maximum: 30 }
    validates :phone, presence: true, length: { in: 10..25 }
    validates :latitude, :longitude, presence: true, length: { maximum: 20 }
    validates :type, presence: true

pharmacy.rb

class Pharmacy < Hospital
   self.table_name = 'pharmacies' 
end

Обе таблицы имеют одинаковые столбцы, и я решил использоватьMTI увеличит масштабируемость моей базы данных, поскольку и в аптеке, и в больнице также будет ИППП для нескольких моделей.

Я получаю ошибку:

ActiveRecord::SubclassNotFound:
       Invalid single-table inheritance type: Hospital is not a subclass of Pharmacy

Я бы хотелповторно использовать валидации и некоторые методы, которые я намереваюсь реализовать для обеих моделей.

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Если вы используете отдельную таблицу, вы не должны использовать другую модель в качестве подкласса. В этом случае вы просто хотите наследовать от ActiveRecord::Base. Если вы хотите поделиться валидациями, вы можете поместить их в модуль и потребовать его в обеих моделях.

Конечно, вы также можете перейти к реальной ИППП, но в этом случае вам нужно будет добавить столбец type в одну таблицу. В этом случае вы можете наследовать от Hospital, но было бы еще лучше наследовать от Institute, и пусть Hospital также наследует от этого базового класса.

class Institute < ActiveRecord::Base
  # put your validations here
end

class Hospital < Institute
end

class Pharmacy < Institute 
end

Редактировать: если вы хотите использовать MTI ... см. Этот ответ, чтобы узнать, как настроить проверку Mixins: https://stackoverflow.com/a/11372578/891359

1 голос
/ 20 мая 2019

Вам нужен абстрактный класс:

class Hospital < ActiveRecord::Base
  self.abstract_class = true

  # validations...
end

Затем удалите имена таблиц из своих подклассов.

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