创建大型哈希的Ruby方法

hlswsv35  于 2023-05-28  发布在  Ruby
关注(0)|答案(2)|浏览(128)

我使用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中的最佳实践方法是什么?

ekqde3dh

ekqde3dh1#

不确定是否有一个商定的最佳实践,但我经常看到这种东西被存储在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文件加载你的大部分属性,并根据需要修改对象/哈希。
或者,您可以将相同的属性存储在模块内的常量中,加载该模块,并以这种方式分配搜索属性。
就像我说的,不确定是否有一个最佳实践围绕这类事情,但我已经看到这两种模式在野外无数次。

nqwrtyyt

nqwrtyyt2#

当然,您可以构造一个包含唯一位的数组(数组中的每个元素都是一个散列),然后将这些元素Map到所需的数组。

def generate_params(search)
  distinct_elements = [ 
    { 
      query: {
        neural: {
          passage_embedding: {
            query_text: search,
            k: 100
          }
        }
      },
      source_score: '1.5'
    },
    {
      query: {
        multi_match: {
          query: search,
          fields: %w[field_a field_b field_c field_d]
        }
      },
      source_score: '1.7'
    }
  ]

  distinct_elements.map do |h|
      {
        script_score: { query: h[:query] },
        script: { source: "_score * #{ h[:source_score] }" }
      }
    end
end
generate_params('everywhere')
  #=> [
  #     {
  #       :script_score=>{
  #         :query=>{
  #           :neural=>{
  #             :passage_embedding=>{
  #               :query_text=>"everywhere",
  #               :k=>100
  #             }
  #           }
  #         }
  #       },
  #       :script=>{
  #         :source=>"_score * 1.5"
  #       }
  #     },
  #     {
  #       :script_score=>{
  #         :query=>{
  #           :multi_match=>{
  #             :query=>"everywhere",
  #             :fields=>["field_a", "field_b", "field_c", "field_d"]
  #           }
  #         }
  #       },
  #       :script=>{:
  #         source=>"_score * 1.7"
  #       }
  #     }
  #   ]

相关问题