在我的应用程序中,我有一个名为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
我有一大堆子类,通过我的Rails应用程序中的单表继承从父类继承.我想要一种方法来获取从主类继承的所有子类的数组.
我尝试了在另一个SO答案中找到的以下单链接命令,但它只返回父类.
ObjectSpace.each_object(class<<MyParentClass;self;end)
Run Code Online (Sandbox Code Playgroud)
有没有干净的方法来做到这一点?
编辑: 显然Rails只在惰性模式下调用延迟加载子类,并且可能根据Rails版本生成.但是,第一个答案应该适用于Prod模式下的Rails 3.1及更高版本.
我已经阅读了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时正常工作,但是,如果删除User或Team删除会发生什么?
即.如果User被删除,在行UserPlaylist会被删除,但被引用的行中Playlist,并PlaylistVideo仍将保留.我考虑过强制执行此操作,TRIGGER AFTER DELETE但无法知道删除请求是否因为Playlist已删除或删除而导致User.
在这种情况下,强制执行诚信的最佳方法是什么?
编辑(提供ERD)

mysql referential-integrity single-table-inheritance polymorphic-associations cascading-deletes
使用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' …
我一直在玩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)
Baby属于什么?babies桌面上为外键命名/添加什么?我首先想到的是添加parental_id到babies具有类似的方法沿着Baby#owner该执行以下操作:
谢谢!
ruby-on-rails has-many single-table-inheritance sti ruby-on-rails-3
我已经设置了一个基于角色的访问控制系统,其中包含以下模型:
如果用户具有特定的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
在 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
在过去的几个小时里,我一直在努力思考我应该走哪条路线.我有一个通知模型.到目前为止,我已经使用了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?
我正在阅读类表继承(CTI),发现我更喜欢它.我的问题是,单表继承(STI)是否有任何特定用例,您可以在CTI上使用它?
我读了http://rhnh.net/2010/07/02/3-reasons-why-you-should-not-use-single-table-inheritance,据我所知,它很稳固.STI的用例是行为差异而不是数据.
我正在使用Rails 3.2应用程序,我使用Devise进行身份验证.我决定尝试单表继承来管理用户角色,但我很快就遇到了问题.我目前有三个用户模型User < ActiveRecord,Admin < User和Collaborator < 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
has-many ×2
python ×2
activerecord ×1
conditional ×1
devise ×1
django ×1
inheritance ×1
mysql ×1
ruby ×1
sqlalchemy ×1
sti ×1
validation ×1