Проще всего объяснить пример кода, в 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? Или, может быть, есть другой, лучший способ сделать это? Я знаю скрепку, но мне не нравится, когда она использует общую таблицу для хранения фотографий и данных модели.
Похоже, вы хотите либо полиморфную ассоциацию, либо, возможно, одиночное наследование таблицы.
get_mime
)?
Поскольку вы не определяете поля базы данных в модели, вы не можете наследовать схему базы данных таким образом - все ваши поля должны быть указаны для каждой таблицы в процессе миграции. Вероятно, вы должны использовать paperclip
, хотя бы потому, что изобретать колесо - это боль. Он работает очень хорошо и абстрагируется от фактической структуры базы данных для вас.
В Rails, а не на наследование модели, совместная функциональность обычно реализуется в модулях, например: http://handyrailstips.com/tips/14-drying-up-your-ruby-code-with-modules
Image
иBase
еслиImage
уже наследуется отBase
.