- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 Rails 应用程序中,我正在实现一个类似于调查的表单,它允许用户填写一组动态变化的问题的答案。目前,我计划支持三种不同“类型”的问题:是/否、评级(1-5 级)和文本。对于这些问题类型中的每一个,我需要相应答案模型的行为略有不同(以适应不同的方法、验证要求等)。我目前正在尝试使用单表继承来实现这些不同的行为,如下所示:
class Question < ActiveRecord::Base
validates_presence_of :question_type
# ...
end
class Answer < ActiveRecord::Base
belongs_to :question
validates_presence_of :answer
# ...
end
class YesNoAnswer < Answer
validates :answer, inclusion: {in: %w(Yes No N/A)}
# ...
end
class RatingAnswer < Answer
validates :answer, numericality: { only_integer: true }, inclusion: {in: 1..5}
def answer
self[:answer].to_i
end
# ...
end
class TextAnswer < Answer
validates :answer, length: { minimum: 2 }
# ...
end
"type"
,但您可以通过设置
inheritance_column
来更改它)。
class Answer < ActiveRecord::Base
# I want a value on the associated question to determine this record's type.
# Simply defining a type method as shown here doesn't work though.
def type
question.try(:question_type)
end
end
最佳答案
inheritance_column
不确定类,它存储 type
的名称列,然后确定用于给定记录的类。
因此,通过更改 inheritance_column
值,您可以存储通常存储在 type
中的内容另一列中的列。
这不会帮助您动态确定类名称的存储位置,因为它只是指向另一列,然后由该列中的值确定类。
另见:http://apidock.com/rails/ActiveRecord/ModelSchema/ClassMethods/inheritance_column
Single-Table-Inheritance (STI) 专门用于您希望保留有些相似但根据类型保留不同属性的模型的情况。
换句话说:除非你想在模型中保留不同的东西,否则你不应该使用 STI。
如果您只是想要根据问题类型的不同行为,您可以这样做:
根据问题的类型,您可以通过调用 extend
以您喜欢的行为扩展 Answer 实例。在必要的 Ruby 模块上:
class Question < ActiveRecord::Base
validates_presence_of :kind
has_many :answers
# ... contains an attribute 'kind' to determine the kind of question
end
class Answer < ActiveRecord::Base
belongs_to :question
validates_presence_of :answer
# when a new instance of Answer is created, it automatically extends itself's
# behavior from the given Ruby Module, which is conveniently stored as a Rails Concern
def initialize
case question.kind
when 'yes_no'
self.class.send(:extend, YesNo)
when 'rating'
self.class.send(:extend, Rating)
when 'text'
self.class.send(:extend, Text)
else
# ...
end
end
end
./app/models/concerns
您有不同的文件,其中包含定义要添加到 Answer 类的行为的模块,具体取决于问题的类型:
# file concerns/yes_no.rb
module YesNo
validates :answer, inclusion: {in: %w(Yes No N/A)}
end
# file concerns/rating.rb
module Rating
validates :answer, numericality: { only_integer: true }, inclusion: {in: 1..5}
def answer
self[:answer].to_i
end
# ...
end
# file concerns/text.rb
module Text
validates :answer, length: { minimum: 2 }
end
关于ruby-on-rails - Rails 单表继承 : determining class programmatically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25409149/
我很难找到正确的搜索语法:) 作为作业的一部分,我正在为 Android 开发一个国际象棋游戏。 我想使用按钮。 我画了棋盘,可以选择一个按钮(即我要移动的棋子)。 我可以点击一 block (按钮)
我有两个类,一个依赖于硬件,一个不依赖于硬件(我们分别称它们为 HardwareDependent 和 HardwareIndependent)。硬件相关类扩展了硬件独立类。现在我有另一个类,它至少必
在这里得到一个 Hibernate MappingException,我不知道为什么。 这是我得到的错误: 2014/01/13 23:58:38 [] ERROR GrailsContextLoad
我想了解 RODBC 如何确定新创建的 (Access) 表的列类型? sqlSave 的 R 文档非常神秘:“类型是通过咨询参数 varTypes 和 typeInfo 来选择的”。并且没有这个论点
我有一个具有定义高度的 div,并且 overflow:scroll; 。它的内容太长,因此出现滚动条。 现在是发痒的部分。它的一些内部 HTML 总是奇怪地出现(准确地说,是 tableFilter
场景 某些 SQL 代理作业计划全天每隔几分钟运行一次。 在某些情况下,它会错过下一个计划,因为它仍在按照上一个计划运行。 每隔一段时间,作业可能会“挂起”。这不会产生失败(因为作业尚未停止)。发生这
目前我使用这个解决方案来加载资源: URL url = MyClass.class.getClassLoader().getResource("documents/"+path); if(url ==
我正在尝试使用nRoomAllocationId在房间传输和房间部门映射类上实现多对一和一对多双向映射。 房间转移类 @Entity @Table(name="roomtransfer") publi
我有一个来自类的 print 方法: public void print(EditorPanePrinter epp) { try { PrinterJob pj=Printe
确定文件所在目录的好方法是什么?我会使用 realpath(),但这会返回符号链接(symbolic link)指向的文件或目录的绝对路径。 例如,如果参数是文件的基名,并且 lstat() 返回 0
我有一个名为 account 的抽象类,如下所示 - abstract class Account { private int number; private String owner
我一直在编写一个打开 Firebird 数据库的小型 Python 应用程序。 为了实现此目标,我使用嵌入的 Firebird 2.5.7.27050,64 位。 尽管如此,无论何时我尝试使用 Pyt
我有一个非常有趣的(至少对我而言)问题要解决(而且,不,这不是家庭作业)。它等同于:您需要确定用户在他的计算机前进行的“ session ”和“ session 开始和结束时间”。 您将获得进行任何用
从 iOS8 开始,您需要注册并提示用户使用本地通知。因此,我想实现一种方法来仔细检查这些权限。 如何检查本地通知设置是否未确定/未设置?到目前为止,我只知道如何检查本地通知是否被granted 或d
在我的应用程序中,我使用 Google In-app Billing Version 3 API 实现应用内购买。在我的应用程序的日志中,我看到: D/Finsky (26024): [1204]
我的小部件有几个 ImageButtons,为它们设置 onClicked 事件,我使用 PendingIntent: Intent intent = new Intent(context, Upda
推送到 github 工作正常。我认为当我从 github checkout 一个分支时,这个问题就开始了。我该如何解决?当我现在尝试推送到 github 时,出现错误“无法确定当前分支。” 此外,我
我正在尝试使用表数据导入向导工具将一个 csv 文件导入到我的数据库中,导入到只有一个属性(它的 ID VARCHAR(10))的表中,导入失败并向我显示此错误:error我检查了 csv 文件以查找
我正在尝试将一些随机生成的数字“合并”在我之前拥有的值向量中的相邻值之间定义的间隔之间。所以基本上,我有以下几点: vectorA包含从 101 到 0 的 101 个值。 我生成一个名为 x 的随机
我要执行一个脚本file.R使用 Rscript .在 file.R ,我使用包dplyr . # file.R df outputFile.Rout 2>&1 但是,如果我添加 default-p
我是一名优秀的程序员,十分优秀!