标签: single-table-inheritance

处理rails中STI子类路由的最佳实践

我的Rails视图和控制器上到处是redirect_to,link_toform_for方法调用.有时link_to并且redirect_to在它们链接的路径中是明确的(例如link_to 'New Person', new_person_path),但很多时候路径是隐式的(例如link_to 'Show', person).

我将一些单表继承(STI)添加到我的模型中(比方说Employee < Person),并且所有这些方法都会破坏子类的实例(比如说Employee); 当rails执行时link_to @person,它会出错undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>.Rails正在寻找由对象的类名定义的路由,即雇员.这些员工路线未定义,并且没有员工控制器,因此也未定义操作.

之前已经问过这个问题:

  1. StackOverflow,答案是编辑整个代码库中link_to等的每个实例,并明确说明路径
  2. 再次在StackOverflow上,有两个人建议使用routes.rb将子类资源映射到父类(map.resources :employees, :controller => 'people').在同一个SO问题中的最佳答案建议使用代码库中的每个实例对象进行类型转换.becomes
  3. StackOverflow的另一个问题,最重要的答案是在Do Repeat Yourself阵营中,并建议为每个子类创建重复的脚手架.
  4. 这里是再次同样的问题在SO,其中顶部的答案似乎只是错误的(Rails的魔法可以工作了)
  5. 在网络的其他地方,我发现了这篇博文,其中F2Andy建议在代码中的任何地方编辑路径.
  6. 在Logical Reality Design 上的单表继承和RESTful路由的博客文章中,建议将子类的资源映射到超类控制器,如上面的SO答案2中所示.
  7. 亚历克斯·赖斯纳有一个帖子在Rails的单表继承中,他主张对映射子类在父类的资源routes.rb,因为只有抓住从路由断裂link_toredirect_to,但不从form_for.所以他建议在父类中添加一个方法,让子类对它们的类​​撒谎.听起来不错,但他的方法给了我错误undefined …

ruby ruby-on-rails single-table-inheritance

169
推荐指数
7
解决办法
3万
查看次数

Rails - 使用没有STI的类型列?

我想使用一个名为type不调用单表继承(STI)的列 - 我只想type成为一个普通的列来保存一个String.

如果没有Rails期望我有单表继承并抛出异常,我怎么能这样做The single-table inheritance mechanism failed to locate the subclass...This error is raised because the column 'type' is reserved for storing the class in case of inheritance.呢?

关于如何做到这一点的任何想法?

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

77
推荐指数
4
解决办法
3万
查看次数

Django中的单表继承

在Django中是否明确支持单表继承?最后我听说,这个特征仍处于开发和辩论之中.

在此期间我是否可以使用库/黑客来捕获基本行为?我有一个混合不同对象的层次结构.具有Employee类的公司结构的规范示例,雇员类型的子类以及manager_id(parent_id)将是我正在解决的问题的良好近似.

就我而言,我想表达一个想法,即员工可以管理其他员工,同时由不同的员工管理.Manager和Worker没有单独的类,这使得这很难跨表传播.子类将代表员工类型 - 程序员,会计师,销售等,并且独立于谁监督谁(好吧,我想它在某些方面不再是典型的公司).

python django django-models single-table-inheritance

25
推荐指数
3
解决办法
9244
查看次数

使用单表继承更改Rails中的ActiveRecord类的类型

我有两种类:

BaseUser < ActiveRecord::Base 
Run Code Online (Sandbox Code Playgroud)

User < BaseUser
Run Code Online (Sandbox Code Playgroud)

其中acts_as_authentic使用Authlogic的身份验证系统.此继承是使用单表继承实现的

如果新用户注册,我将他注册为用户.但是,如果我已经有一个具有相同电子邮件的BaseUser,我想将该BaseUser更改为数据库中的用户,而不是简单地将所有数据从BaseUser复制到用户并创建新用户(即使用新用户) ID).这可能吗?谢谢.

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

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

如何在运行时获取DiscriminatorValue

我们有以下课程

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // optional annotation as this is default
@DiscriminatorColumn(name = "apType", discriminatorType = DiscriminatorType.STRING, length = 255)
@DiscriminatorValue("AP")
public class ApplicationProcess {
}
Run Code Online (Sandbox Code Playgroud)

还有这个

@Entity
@DiscriminatorValue("APS")
public class ApplicationProcessScheme extends ApplicationProcess {
}
Run Code Online (Sandbox Code Playgroud)

现在我需要在运行时知道它是否ApplicationProcessDiscriminatorValue AP or APS.由于这是由jpa自动处理的,我无法获得此值.

我们正在调用一个带ApplicationProcess参数的方法,我想避免使用它instanceof来检查它是什么类型.如果我可以做类似的事情会更酷

applicationProcess.getApType().equals("AP");
Run Code Online (Sandbox Code Playgroud)

java inheritance hibernate jpa single-table-inheritance

24
推荐指数
2
解决办法
2万
查看次数

使用STI时如何将ActiveRecord对象强制转换为另一个类?

我目前正在使用ActiveRecord单表继承.

如何将我的一个模型从A型转换为B型?他们有同一个父母.

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

22
推荐指数
2
解决办法
2万
查看次数

如何在rails STI派生模型中禁用验证和回调?

给定一个模型

class BaseModel < ActiveRecord::Base
  validates_presence_of :parent_id
  before_save :frobnicate_widgets
end
Run Code Online (Sandbox Code Playgroud)

和派生模型(底层数据库表有一个type字段 - 这是简单的rails STI)

class DerivedModel < BaseModel
end
Run Code Online (Sandbox Code Playgroud)

DerivedModel将以良好的OO方式继承所有的行为BaseModel,包括validates_presence_of :parent_id.我想关闭验证DerivedModel,并防止回调方法被触发,最好不要修改或以其他方式破坏BaseModel

什么是最简单,最强大的方法?

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

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

Twig instanceof用于继承对象

我正在推动http://www.propelorm.org/documentation/09-inheritance.html使用以下功能.

我也在使用Symfony2和Twig

我有一个使用上述功能的类结构,看起来像这样

class Event {}

class Birthday extends Event {}

class Walking extends Event {}
Run Code Online (Sandbox Code Playgroud)

现在我将一个事件对象传递给一个twig模板,我想知道它是什么类型的事件

例如,我希望在生日时显示蛋糕的图像,并且如果它的步行事件我想显示地图路线.

我无法在Twig中使用instanceof,因为此功能不存在.有谁现在为什么这不存在?有没有办法我可以复制这个功能,而不必做类似的事情

 public function getType()
Run Code Online (Sandbox Code Playgroud)

在每个班级,或

 public function isBirthday()
Run Code Online (Sandbox Code Playgroud)

在事件类中.

我在github上发现了这个,但它对我没用.我评论过他们是否能得到答案.

https://github.com/fabpot/Twig/issues/553

propel single-table-inheritance symfony twig

18
推荐指数
2
解决办法
2万
查看次数

Rails STI:如何更改"类型"列的类名和值之间的映射

由于公司规则,我不能使用我们的域名类; 我打算用一个类比来代替.我有一个名为projects的表,其中有一个名为'type'的列,可能的值为'indoor'和'outdoor'.室内和室外的记录具有明显的功能分离,并且作为STI实现非常巧妙地适合.不幸的是,我无法更改类型名称,也无法在全局命名空间中添加类.有没有办法为'type'指定不同的值?

注意:我不是要为STI使用不同的列名而不是'type'.我希望除了我的类名之外,还有不同的类型值.

types ruby-on-rails single-table-inheritance sti

14
推荐指数
1
解决办法
7599
查看次数

Hibernate HT_临时表ON JOINED继承,从Hibernate 3.4.0.GA迁移到5.1

我正在尝试将应用程序从Hibernate 3.4.0.GA迁移到Hibernate 5.1,在完成java代码所需的更改后,当我部署应用程序时,我正在观察Hibernate如何尝试创建HT_表(全局临时) ,每个@Inheritance注释实体一个.

在Google上搜索我发现了为什么要创建表格.

但在我的情况下,我们不允许更改de数据库以添加新表.

我的继承模型只有一个级别的继承及其简单的示例

有没有人知道我可以用来避免HT_表创建的分层表结构的任何替代表示,或者某些Hibernate配置存档相同的目的?

我可以更改实体或Hibernate配置的继承层次结构.如果对表的其余部分没有阻塞,我也可以因为非创建表而导致部署异常.

先感谢您.

更新1: 来自Hibernate官方论坛的新信息.

更新2: Bug已修复

更新3: 博客条目,解释与该问题相关的不同批量策略

java hibernate single-table-inheritance jpa-2.1

14
推荐指数
1
解决办法
8670
查看次数