我使用的是Ruby on rails.

我有一个控制器,它向API发出后续请求,该API需要插入一些值的大型数组参数.

我正在使用如下所示的方法生成此参数:

      def generate_params(search)
        [
          {
            script_score: {
              query: {
                neural: {
                  passage_embedding: {
                    query_text: search,
                    k: 100
                  }
                }
              },
              script: {
                source: '_score * 1.5'
              }
            }
          },
          {
            script_score: {
              query: {
                multi_match: {
                  query: search,
                  fields: %w[field_a field_b field_c field_d]
                }
              },
              script: {
                source: '_score * 1.7'
              }
            }
          }
        ]
      end

search参数被插入到从该方法返回的数组中.

我的问题是:在Ruby/Ruby on rails中为这样的大型对象定义模板的最佳实践是什么?

正如您从示例中看到的,其中95%是静态模板语法,只有2个值由变量填充.

我希望将方法大小减少到尽可能小,并且想知道是否有某种方法可以将此数组定义为方法之外的某个模板?具体来说,Ruby中的最佳实践方法是什么?

推荐答案

我不确定是否有一个公认的最佳实践,但我经常看到这种东西存储在YAML文件中.

因此,如果您使用您的配置创建一个YAML文件,您可以执行类似以下操作:

require 'yaml'
my_configuration = YAML.load_file('path_to_yaml_file.yml')

这将允许您将YAML文件的值视为散列:

my_configuration[:script_score][:query][:multi_match][:query] = 'some_value_or_method_call'

您可以将其转储到数组中或需要对其执行的任何其他操作中--关键是您可以通过YAML文件加载大多数属性,并根据需要修改对象/散列.

或者,您可以将相同的属性存储在模块内的常量中,加载该模块,并以这种方式分配搜索属性.

就像我说的,我不确定这类事情是否有最好的做法,但我在野外见过无数次这两种模式.

Ruby-on-rails相关问答推荐

Rails 7通过引擎将方法自动加载到控制器中的方法

从Rails中的字符串中间提取子字符串

Rails simple_form 元素与数据-... 刺激的属性?

当我必须更改 rspec 中的方法时,如何检测时间?

Rails 100% 新手问题 - send() 方法

Rails 中的转义值(类似于 mysql_real_escape_string())

如何在 Ruby on Rails 中创建一个锚点并重定向到这个特定的锚点

如何在 Linux 上使用 Ruby 2.0 改进独角兽进程之间的内存共享

可能在rails中有多态has_one关系?

在 Rails/ActiveRecord 列名中使用问号字符

.increment vs += 1

设计自定义路由和登录页面

Rails:将所有未知路由重定向到 root_url

验证一个对象是否有一个或多个关联对象

如何在 Ruby on Rails 的内存缓存存储中列出键?

ActiveRecord 事务中的错误处理?

Test::Unit Rails - 如何断言一个数字大于另一个?

ruby 方法名称中的变量

我的 JavaScript 模式/实践很糟糕.我应该go 哪里寻求帮助?

何时在 Ruby on Rails 中使用 lambda?