Наследование модели Rails

1

Проще всего объяснить пример кода, в Python я могу сделать это, чтобы добиться наследования модели:

"""Image model"""
from sqlalchemy import Column, ForeignKey
from sqlalchemy.types import Integer, String, Text
from miasto_3d.model.meta import Base

class Image(Base):
    __tablename__ = "image"
    image_id = Column(Integer, primary_key=True)
    path = Column(String(200))

    def get_mime(self):
        #function to get mime type from file
        pass



"""WorkImage model"""
class WorkImage(Image, Base):
    __tablename__ = "work_images"

    image_id = Column(Integer, ForeignKey("image.image_id"), primary_key=True)
    work_id = Column(Integer, ForeignKey("work.id"))
    work = relation("Work", backref=backref('images',order_by='WorkImage.work_id'))

"""UserAvatar model"""
class UserAvatar(Image, Base):
    __tablename__ = "user_avatars"

    image_id = Column(Integer, ForeignKey("image.image_id"), primary_key=True)
    user_id = Column(Integer, ForeignKey("user.id"))
    user = relation("User", backref=backref('images',order_by='UserAvatar.user_id'))   

Как я делаю подобные вещи в Rails? Или, может быть, есть другой, лучший способ сделать это? Я знаю скрепку, но мне не нравится, когда она использует общую таблицу для хранения фотографий и данных модели.

  • 3
    Вам не нужно наследовать от Image и Base если Image уже наследуется от Base .
  • 0
    Конечно, ты прав.

2 ответа

2
Лучший ответ

Похоже, вы хотите либо полиморфную ассоциацию, либо, возможно, одиночное наследование таблицы.

  • 0
    Могу ли я определить методы внутри моделей так же, как в Pylons ( get_mime )?
  • 1
    У меня нет опыта работы с пилонами, но да, вы можете определять методы в полиморфных моделях и моделях ИППП.
0

Поскольку вы не определяете поля базы данных в модели, вы не можете наследовать схему базы данных таким образом - все ваши поля должны быть указаны для каждой таблицы в процессе миграции. Вероятно, вы должны использовать paperclip, хотя бы потому, что изобретать колесо - это боль. Он работает очень хорошо и абстрагируется от фактической структуры базы данных для вас.

В Rails, а не на наследование модели, совместная функциональность обычно реализуется в модулях, например: http://handyrailstips.com/tips/14-drying-up-your-ruby-code-with-modules

  • 0
    Но это связано не только с изображениями, это могут быть, например, адреса.
  • 1
    Итак, вы говорите, что хотите определить некоторые поля один раз и использовать их во многих моделях? Я думаю, что это ограничивает ваши возможности: а) объект для хранения ваших данных и полиморфная принадлежность («общая таблица» - т.е. People has_one: Address), б) определение одних и тех же полей в нескольких моделях.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню