Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将文本转换为代码_Ruby On Rails_Ruby On Rails 3_Workflow - Fatal编程技术网

Ruby on rails 将文本转换为代码

Ruby on rails 将文本转换为代码,ruby-on-rails,ruby-on-rails-3,workflow,Ruby On Rails,Ruby On Rails 3,Workflow,我正在创建一个产品配置程序。问题是每个产品都有许多组件,这些组件本身是可配置的。假设您在购买计算机时正在配置它。 当选择一个组件时,或者当一个组件的数量增加时,或者甚至当两者结合时,依赖关系有时适用。这一切在某一点上变得非常复杂,并且在不同的产品中并不一致,因为在某种意义上,每个产品都是自己的宇宙 哦,而且这些规则一直在变化,所以在应用程序中对它们进行编码对我来说并不是一个真正的选择 我希望能够将名为validate的方法的代码存储在数据库中。 每个配置都有自己的validate版本,它将作为文

我正在创建一个产品配置程序。问题是每个产品都有许多组件,这些组件本身是可配置的。假设您在购买计算机时正在配置它。 当选择一个组件时,或者当一个组件的数量增加时,或者甚至当两者结合时,依赖关系有时适用。这一切在某一点上变得非常复杂,并且在不同的产品中并不一致,因为在某种意义上,每个产品都是自己的宇宙

哦,而且这些规则一直在变化,所以在应用程序中对它们进行编码对我来说并不是一个真正的选择

我希望能够将名为validate的方法的代码存储在数据库中。 每个配置都有自己的validate版本,它将作为文本存储在数据库中,并且可以在需要时进行更改

有可能做到这一点吗?我如何获取文本并让rails实际执行文本中的任何内容

例如,我有:

irb(main):246:0> @h= Configuration.find(1).rule
=> "def getmax3(inputarray)\n    @maxpos = 0\n    inputarray.each do |h|\n      if @maxpos < h.position\n      @maxpos = h.position\n      end\n    end\n    1\n end"
irb(main):246:0>@h=Configuration.find(1).rule
=>“如果@maxpos
这显然不是代码。当然,上面的方法只是一个测试,因为我正试图弄清楚

(哦,我知道这样做一定很可怕,但我真的想不出其他办法)


非常感谢

是的,这是一种可怕的做法:)

如果您有简单且稳定的规则要实现,您可以将一些变量存储在专用表中,并在规则中使用这些变量;因为看起来您不知道这些规则会发生什么,所以请准备好使用经过测试和验证的工作流来接受任何挑战

以下是我的建议:

  • 使用capistrano和其他工具设置自动部署过程
  • 在专用的验证库中编写规则
  • 编码和测试规则,提交和部署

定义DSL可以让你的生活更轻松,如果你长期致力于操纵这些规则,并且你不可能是唯一负责这项任务的人;观察规则是如何在相当长的时间内改变的,你就会知道拥有一个专用的DSL是好事还是浪费时间。

我可能误解了你的问题,但是如果你能将代码从数据库中提取出来,放入可以测试和版本控制的文件中,你会感到更快乐。如果不知道你的模型的复杂性,很难说最好的方法是什么,但我保证有一个

我过去曾使用单表继承对具有共享公共属性和行为的相关组件的复杂系统进行建模。您可以在应用程序中使用这种方法。STI基本上说,在您的案例配置中,您有一个父类和子类,它们都位于同一个表中。如果某些子类(而不是所有子类)之间存在共享行为,则可以将代码移动到模块中,并包含在需要它的类中

基本父类将仅从ActiveRecord继承:

class Configuration < ActiveRecord::Base
end
类配置
然后,每个子类将在其中定义其逻辑:

class Component < Configuration
  def getmax3(inputarray)
    @maxpos = 0
    inputarray.each do |h|
      if @maxpos < h.position
        @maxpos = h.position
      end
    end
    1
  end
end
类组件

我并不是说这是您想要走的方向,但希望它能让您思考其他建模系统的方法。

谢谢您的回复。我是一个RoR初学者,所以这个建议似乎离现实很远。我在哪里存储此配置库?这是我作为文件放在应用程序中的东西吗?在Lib文件夹中?尽可能简单地开始。这些规则是验证规则吗?把它们放在你的模型里。与应用程序的工作流相关的内容?让控制器成为他们的家。你以后会自己决定的。