Как можно использовать rails polymorphic для объектов, которые на самом деле имеют поля?

#ruby-on-rails #ruby #model #polymorphism

#ruby-on-rails #ruby #Модель #полиморфизм

Вопрос:

Допустим, у меня есть модель пользователя, и я хочу иметь разные роли пользователя. В одном приложении вы можете просто сохранить роль в виде строки или в виде другой модели, и это нормально.

Но что, если вы хотите сохранить больше ассоциаций для отдельных моделей? Например, допустим, Adminsсодержит ссылки на коллекции и принадлежит ко многим коллекциям, с которыми обычные пользователи не должны быть связаны? Фактически, другие пользователи будут связаны с совершенно другим набором моделей, которых нет у администраторов.

Помещаем ли мы все ассоциации в объект User и просто игнорируем их в зависимости от типа пользователя? Или мы начинаем создавать подклассы User (как в Hibernate), чтобы содержать только ассоциации и логику модели для этого типа пользователя?

Как это можно сделать в rails? Спасибо!

Ответ №1:

Я бы предложил использовать Rails Single Table Наследование. По сути, у вас будет users таблица в вашей базе данных и корневая User модель. Несколько моделей (по одной для каждой «роли») могут наследоваться от User и иметь свои собственные ассоциации:

 # Regular users have no associations
class User < ActiveRecord::Base
end

# Admins have collections and notes
class Admin < User
  has_many :collections
  has_many :notes
end

# Editors only have notes
class Editor < User
  has_many :notes
end
  

Комментарии:

1. Спасибо! Это похоже на java. Рад слышать, что я могу это сделать 😉