我的Rails视图和控制器上到处是redirect_to,link_to和form_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正在寻找由对象的类名定义的路由,即雇员.这些员工路线未定义,并且没有员工控制器,因此也未定义操作.
之前已经问过这个问题:
routes.rb将子类资源映射到父类(map.resources :employees, :controller => 'people').在同一个SO问题中的最佳答案建议使用代码库中的每个实例对象进行类型转换.becomesroutes.rb,因为只有抓住从路由断裂link_to和redirect_to,但不从form_for.所以他建议在父类中添加一个方法,让子类对它们的类撒谎.听起来不错,但他的方法给了我错误undefined …我想使用一个名为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.呢?
关于如何做到这一点的任何想法?
在Django中是否明确支持单表继承?最后我听说,这个特征仍处于开发和辩论之中.
在此期间我是否可以使用库/黑客来捕获基本行为?我有一个混合不同对象的层次结构.具有Employee类的公司结构的规范示例,雇员类型的子类以及manager_id(parent_id)将是我正在解决的问题的良好近似.
就我而言,我想表达一个想法,即员工可以管理其他员工,同时由不同的员工管理.Manager和Worker没有单独的类,这使得这很难跨表传播.子类将代表员工类型 - 程序员,会计师,销售等,并且独立于谁监督谁(好吧,我想它在某些方面不再是典型的公司).
我有两种类:
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).这可能吗?谢谢.
我们有以下课程
@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)
现在我需要在运行时知道它是否ApplicationProcess是DiscriminatorValue AP or APS.由于这是由jpa自动处理的,我无法获得此值.
我们正在调用一个带ApplicationProcess参数的方法,我想避免使用它instanceof来检查它是什么类型.如果我可以做类似的事情会更酷
applicationProcess.getApType().equals("AP");
Run Code Online (Sandbox Code Playgroud) 我目前正在使用ActiveRecord单表继承.
如何将我的一个模型从A型转换为B型?他们有同一个父母.
ruby activerecord casting ruby-on-rails single-table-inheritance
给定一个模型
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
什么是最简单,最强大的方法?
我正在推动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上发现了这个,但它对我没用.我评论过他们是否能得到答案.
由于公司规则,我不能使用我们的域名类; 我打算用一个类比来代替.我有一个名为projects的表,其中有一个名为'type'的列,可能的值为'indoor'和'outdoor'.室内和室外的记录具有明显的功能分离,并且作为STI实现非常巧妙地适合.不幸的是,我无法更改类型名称,也无法在全局命名空间中添加类.有没有办法为'type'指定不同的值?
注意:我不是要为STI使用不同的列名而不是'type'.我希望除了我的类名之外,还有不同的类型值.
我正在尝试将应用程序从Hibernate 3.4.0.GA迁移到Hibernate 5.1,在完成java代码所需的更改后,当我部署应用程序时,我正在观察Hibernate如何尝试创建HT_表(全局临时) ,每个@Inheritance注释实体一个.
在Google上搜索我发现了为什么要创建表格.
但在我的情况下,我们不允许更改de数据库以添加新表.
我的继承模型只有一个级别的继承及其简单的示例
有没有人知道我可以用来避免HT_表创建的分层表结构的任何替代表示,或者某些Hibernate配置存档相同的目的?
我可以更改实体或Hibernate配置的继承层次结构.如果对表的其余部分没有阻塞,我也可以因为非创建表而导致部署异常.
先感谢您.
更新1: 来自Hibernate官方论坛的新信息.
更新2: Bug已修复
更新3: 博客条目,解释与该问题相关的不同批量策略