标签: single-table-inheritance

如何在单表继承中运行子类的验证?

在我的应用程序中,我有一个名为Budget的类.预算可以是多种类型.例如,假设有两个预算:FlatRateBudget和HourlyRateBudget.两者都继承自预算班.

这是我到目前为止所得到的:

class Budget < ActiveRecord::Base
  validates_presence_of :price
end

class FlatRateBudget < Budget
end

class HourlyRateBudget < Budget
  validates_presence_of :quantity
end
Run Code Online (Sandbox Code Playgroud)

在控制台中,如果我这样做:

b = HourlyRateBudget.new(:price => 10)
b.valid?
=> false
b.errors.full_messages
=> ["Quantity can't be blank"]
Run Code Online (Sandbox Code Playgroud)

正如所料.

问题是STI上的"类型"字段来自params ..所以我需要做类似的事情:

b = Budget.new(:type => "HourlyRateBudget", :price => 10)
b.valid?
=> true
Run Code Online (Sandbox Code Playgroud)

这意味着rails在超类中运行验证,而不是在我设置类型后实例化子类.

我知道这是预期的行为,因为我正在实例化一个不需要数量字段的类,但我想知道是否还有告诉rails运行子类的验证而不是super.

validation activerecord ruby-on-rails single-table-inheritance

13
推荐指数
2
解决办法
7734
查看次数

从Rails中的单表继承获取子类的列表/数组?

我有一大堆子类,通过我的Rails应用程序中的单表继承从父类继承.我想要一种方法来获取从主类继承的所有子类的数组.

我尝试了在另一个SO答案中找到的以下单链接命令,但它只返回父类.

ObjectSpace.each_object(class<<MyParentClass;self;end)
Run Code Online (Sandbox Code Playgroud)

有没有干净的方法来做到这一点?

编辑: 显然Rails只在惰性模式下调用延迟加载子类,并且可能根据Rails版本生成.但是,第一个答案应该适用于Prod模式下的Rails 3.1及更高版本.

ruby-on-rails single-table-inheritance

13
推荐指数
5
解决办法
8594
查看次数

如何在单表继承上强制引用完整性?

我已经阅读了Bill Karwin关于单表继承的一些答案,并认为这种方法对我正在考虑的设置有好处:

Playlist
--------
id AUTO_INCREMENT
title

TeamPlaylist
------------
id REFERENCES Playlist.id
teamId REFERENCES Team.id

UserPlaylist
------------
id REFERENCES Playlist.id
userId REFERENCES User.id

PlaylistVideo
-------------
id
playlistId REFERENCES Playlist.id
videoId REFERENCES Video.id
Run Code Online (Sandbox Code Playgroud)

所有CASCADE选项都设置DELETE为在Playlist删除a时正常工作,但是,如果删除UserTeam删除会发生什么?

即.如果User被删除,在行UserPlaylist会被删除,但被引用的行中Playlist,并PlaylistVideo仍将保留.我考虑过强制执行此操作,TRIGGER AFTER DELETE但无法知道删除请求是否因为Playlist已删除或删除而导致User.

在这种情况下,强制执行诚信的最佳方法是什么?

编辑(提供ERD)

在此输入图像描述

mysql referential-integrity single-table-inheritance polymorphic-associations cascading-deletes

13
推荐指数
2
解决办法
2469
查看次数

SQLAlchemy ORM:多态单表继承,如果找不到"polymorphic_identity",则回退到父类

使用Python 3.5和SQLAlchemy 1.0.14(ORM).

我有一个声明如下的项目表:

from sqlalchemy.ext.declarative.api import declarative_base

Base = declarative_base()

class Item(Base):
    __tablename__ = 'items'

    id = Column(Integer, primary_key=True)
    type = Column(String)
    # other non relevant attributes
Run Code Online (Sandbox Code Playgroud)

我的项目可以有许多不同的类型,存储的类型标识符type.对于其中一些对象类型,我需要具有特定的方法或属性.

为了实现这一点,我尝试使用单个表继承与几个SpecialisedItem作为Item的子类:

class Item(Base):
    __tablename__ = 'items'

    id = Column(Integer, primary_key=True)
    type = Column(String, index=True)
    # other non relevant attributes

    __mapper_args__ = {
        'polymorphic_on': type,
    }

class SpecialisedItem(Base):
    __mapper_args__ = {
        'polymorphic_identity': 'specialitem',
    }

    def specialised_method(self):
        return "I am special"
Run Code Online (Sandbox Code Playgroud)

现在当我加载我的项目时,我希望所有特殊项目(有type=='specialitem')都这样加载,而任何其他类型的值将导致父类Item被加载.这不起作用,我AssertionError: No such polymorphic_identity 'normal' …

python sqlalchemy single-table-inheritance

13
推荐指数
2
解决办法
2924
查看次数

Rails问题:有STI的belongs_to - 我该如何正确地做到这一点?

我一直在玩STI和belongs_to/has_many关系,我有点困惑.

基于类似于以下的模型配置,我有几个问题:

class Parental < ActiveRecord::Base
end

class Mother < Parental
    has_many :babies
end

class Father < Parental
    has_many :babies
end

class Baby < ActiveRecord::Base
    belongs_to :?????? 
end
Run Code Online (Sandbox Code Playgroud)
  1. 应该Baby属于什么?
  2. 在迁移方面,我应该在babies桌面上为外键命名/添加什么?
  3. 我很难研究这个问题,有没有明确的来源解释这一点?API文档似乎没有击中它或我错过了它(这是完全可能的).

我首先想到的是添加parental_idbabies具有类似的方法沿着Baby#owner该执行以下操作:

  • 命中self.parental
  • 确定父母的类型
  • 返回正确的父母类型(可能是母亲,可能是父亲)

谢谢!

ruby-on-rails has-many single-table-inheritance sti ruby-on-rails-3

12
推荐指数
1
解决办法
6884
查看次数

是否可以在模型中创建条件关联?

我已经设置了一个基于角色的访问控制系统,其中包含以下模型:

  • 角色(作为STI),
    • UserRole(全局角色)
    • ProjectRole(项目特定角色)
  • 赋值(具有不同资源的多态)
  • 用户
  • 项目(作为分配的一种资源类型)

如果用户具有特定的UserRole,则只允许用户负责该项目.此Userrole名称为"负责项目",ID为2.

在用户模型中,有两个has_many关联:responsible_assignments和responsible_projects.仅当用户具有ID为2的UserRole"负责项目"时,此关联才有效.

是否可以在用户模型中为responsible_*关联创建条件关联,这是设置此类关系的常用方法吗?

解决这类问题的最佳做法是什么?

class Role < ActiveRecord::Base
  has_many :assignments
  has_many :users, :through => :assignments

class UserRole < Role

class ProjectRole < Role

class Assignment < ActiveRecord::Base
  belongs_to :user
  belongs_to :role
  belongs_to :resource, :polymorphic => true

class User < ActiveRecord::Base
  has_many :assignments
  has_many :roles, :through => :assignments, 
                   :class_name => "UserRole"
  has_many :responsible_assignments, :class_name => "Assignment",
                                     :conditions => { :role_id => 4 }     // specific project role
  has_many :responsible_projects, :through => :responsible_assignments, 
                                 :source => …
Run Code Online (Sandbox Code Playgroud)

conditional ruby-on-rails has-many single-table-inheritance polymorphic-associations

12
推荐指数
3
解决办法
1万
查看次数

基本数据模型模式的 Django 多表继承替代方案

tl;博士

在 Django 中,是否有一个简单的替代多表继承来实现下面描述的基本数据模型模式?

前提

请考虑下图中非常基本的数据模型模式,它基于例如Hay, 1996

简单地说:Organizationsand Personsare Parties,并且Parties都有Addresses 。类似的模式可能适用于许多其他情况。

这里的重点是 与Address具有显式关系Party,而不是与各个子模型Organization和具有显式关系Person

显示基本数据模型的图表

请注意,每个子模型都引入了额外的字段(此处未描述,但请参阅下面的代码示例)。

这个具体的例子有几个明显的缺点,但这不是重点。为便于讨论,假设该模式完美地描述了我们希望实现的目标,因此剩下的唯一问题是如何在 Django 中实现该模式

执行

我相信,最明显的实现将使用多表继承

class Party(models.Model):
    """ Note this is a concrete model, not an abstract one. """
    name = models.CharField(max_length=20)


class Organization(Party):
    """ 
    Note that a one-to-one relation 'party_ptr' is automatically added, 
    and this is used as the primary key (the …
Run Code Online (Sandbox Code Playgroud)

python django inheritance data-modeling single-table-inheritance

12
推荐指数
1
解决办法
1784
查看次数

Ruby on Rails中的多表继承与单表继承

在过去的几个小时里,我一直在努力思考我应该走哪条路线.我有一个通知模型.到目前为止,我已经使用了notification_type列来管理类型,但我认为最好为通知类型创建单独的类,因为它们的行为方式不同.

现在,有3种方式可以发送通知:短信,推特,电子邮件

每个通知都有:

id
subject
message
valediction
sent_people_count
deliver_by
geotarget
event_id
list_id
processed_at
deleted_at
created_at
updated_at
Run Code Online (Sandbox Code Playgroud)

似乎STI是一个很好的候选人吧?当然Twitter/SMS不会有主题,Twitter也不会有sent_people_count,告别.在这种情况下,我会说他们分享他们的大部分领域.但是,如果我为twitter添加一个"reply_to"字段,为DM添加一个布尔值呢?

我的观点是,现在STI是有道理的,但这是一个案例,我可能会在未来踢我自己,而不仅仅是从MTI开始?

为了使事情更复杂,我想要一个通讯模型,这是一种通知,但区别在于它不会使用event_id或deliver_by.

我可以使用大约2/3的通知基类字段来查看通知的所有子类.STI是不是很明智,或者我应该使用MTI?

ruby-on-rails single-table-inheritance

11
推荐指数
2
解决办法
7179
查看次数

单表继承或类表继承?

我正在阅读类表继承(CTI),发现我更喜欢它.我的问题是,单表继承(STI)是否有任何特定用例,您可以在CTI上使用它?

我读了http://rhnh.net/2010/07/02/3-reasons-why-you-should-not-use-single-table-inheritance,据我所知,它很稳固.STI的用例是行为差异而不是数据.

ruby database-design ruby-on-rails single-table-inheritance

11
推荐指数
1
解决办法
2040
查看次数

在Rails 3.2 App中使用多个模型时,如何使用Devise处理身份验证

我正在使用Rails 3.2应用程序,我使用Devise进行身份验证.我决定尝试单表继承来管理用户角色,但我很快就遇到了问题.我目前有三个用户模型User < ActiveRecord,Admin < UserCollaborator < User.管理员和协作者共享大多数用户列,但他们的行为和权限略有不同.我的模特目前看起来像这样:

class User < ActiveRecord::Base

  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :token_authenticatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :name, :password, :password_confirmation, :remember_me

  before_save :ensure_authentication_token

  [...]

end

class Admin < User
  has_one :account, dependent: :destroy 
  attr_accessible :account_attributes 
  accepts_nested_attributes_for :account
end


class Collaborator < User
  has_one :account
end

class Account < ActiveRecord::Base
  attr_accessible :name
  validates_presence_of :name 
  has_many :projects, dependent: :destroy
  has_many :users
end …
Run Code Online (Sandbox Code Playgroud)

authentication ruby-on-rails single-table-inheritance devise ruby-on-rails-3

11
推荐指数
2
解决办法
6240
查看次数