当前位置:  开发笔记 > 后端 > 正文

Rails单表继承 - 显式设置类型的最佳方法是什么?

如何解决《Rails单表继承-显式设置类型的最佳方法是什么?》经验,为你挑选了3个好方法。

我在rails应用程序中使用单表继承,并希望显式设置实例的类型.

我有以下几点;

class Event < ActiveRecord::Base
class SpecialEvent < Event

这是通过单表继承实现的.

SpecialEvent.new 按预期工作,但我希望能够做到这样的事情

Event.new(:type => 'SpecialEvent')

所以我可以在应用程序中轻松创建不同的子类型.

然而,这并不工作,似乎设置:typenil,没有价值我将其设置为; 我怀疑这是因为通过调用Event.new它会覆盖:type参数.

有没有人有这样做的好方法?



1> Codebeef..:

如果您尝试动态实例化子类型,并且您将类型作为字符串,则可以执行以下操作:

'SpecialEvent'.constantize.new()


这里只是一个快速说明 - 如果此字符串来自表单帖子或类似字符串,请确保您正在清理输入 - 您不希望对来自可能恶意来源的任意数据调用#constantize,例如`klass.constantize.new ()if valid_class_names.include?(klass)`

2> 小智..:

来自"实用 - 使用rails第3版的敏捷Web开发",第380页

还有一个不太明显的约束(使用STI).属性类型也是内置Ruby方法的名称,因此直接访问它以设置或更改行的类型可能会导致奇怪的Ruby消息.相反,通过创建适当类的对象来隐式访问它,或者通过模型对象的索引接口访问它,使用如下所示的东西:

人[:type] ='经理'

伙计,这本书真的很棒



3> Bill..:

不,我想创建子类型的实例,我想以编程方式确定它们是哪个子类型--HermanD

你可以使用工厂模式,虽然我最近听说人们对过度使用这种模式感到不满.基本上,使用工厂来创建您想要获得的实际类型

class EventFactory
  def EventFactory.create_event(event_type)
    event_type.constantize.new()
  end
end

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有