Rails 模型继承

1 投票
2 回答
557 浏览
提问于 2025-04-16 11:56

用代码示例来解释会更简单。在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中怎么做类似的事情呢?或者有没有其他更好的方法?我知道有paperclip这个工具,但我不喜欢它用共享表来存储照片和模型数据的方式。

2 个回答

0

因为你没有在模型中定义数据库字段,所以不能通过这种方式继承数据库结构——你需要在每个表的迁移中单独指定所有字段。你可能应该使用 paperclip,因为重新发明轮子真的很麻烦。它工作得很好,并且为你简化了实际的数据库结构。

在Rails中,与其说是模型继承,不如说共享功能通常是通过模块来实现的,像这样:

http://handyrailstips.com/tips/14-drying-up-your-ruby-code-with-modules

2

看起来你想要的是一种叫做多态关联的东西,或者可能是单表继承

撰写回答