我正在为客户设计调查系统,以便向中央办公室报告数据。在哪些情况下询问哪些问题是一个复杂的问题,需要在不更改代码的情况下进行自定义。我正在考虑以下几点:
模型
Question < ActiveRecord::Base
attr_accessible :conditional_statement
has_and_belongs_to_many :named_conditionals
end
NamedConditional < ActiveRecord::Base
attr_accessible :name
has_and_belongs_to_many :questions
def evaluate
# return true or false, depending on which conditional and the state of the system
end
end
这里的想法是NamedConditional
可以对系统状态进行测试,并返回一个布尔值。然后可以使用conditional_statement
中的Question
中的名称引用这些命名条件,使用许多NamedConditionals
和逻辑运算符。然后,用于确定是否应该询问给定问题的流程将是这样的:
NamedCondtionals
NamedConditionals
NamedConditional
的值来评估conditional_statement
Question
醇>
我的问题是在第3步中,使用eval()
对conditional_statement进行评估有多昂贵?我看到另一个选项是在保存conditional_statement
时将Question
解析为表达式树,将其存储在数据库中(序列化),然后在需要进行评估时对其进行反序列化。
对于给定的请求,可能会发生许多(100+)个问题。显然,我可以缓存并重用每个NamedConditional
的值(因为每个值都将用于多个问题)。在这种情况下,eval()的表现是否优于表达式树?或两种选择都是垃圾?
答案 0 :(得分:0)
强烈的感觉是表达式序列化/反序列化将比仅仅避开一些条件需要更长的时间。
毕竟 - 条件以红宝石的速度评估 - 加上一个用于解释字符串的小常量。序列化/反序列化很慢 - 并且随着N的增加,它将至少在多项式上增加......可能更多。