Ruby / Redmine:从问题主题和适当的自定义字段编译哈希

Ruby / Redmine: compile a hash from issue subjects and appropriate custom fields

我正在使用 Redmine 和 Computed Custom Field plugin

该插件提供了计算自定义字段的可能性,它接受 ruby 代码进行计算。

在 Redmine 中,我有一个项目 (Project_id = 11),我在其中为每个问题在单独的自定义字段中计算产品成本。它看起来像这样:

计算的自定义字段 (cf_id = 34) 中的公式包括两个带有产品价格的哈希值(取决于产品类型):

products_by_weight = {
    "Pears" => [110],
    "Tomatoes" => [120]
}

products_by_pieces = {
    "Pineapples" => [130,300],
    "Coconuts" => [140,200]
}

然后我的公式检查cf_id = 31中选择的产品属于第一或第二哈希并执行相应的计算:

  1. 如果使用第一个列表中的商品,则价格乘以重量 (cf_id = 32)
  2. 或者如果使用第二个列表中的商品,则将价格乘以数量 (cf_id = 33)。 "products_by_pieces" hash 的值数组中的第二个值是每件的重量限制。如果重量除以限制大于 cf_id = 32 中输入的数量,则方案 2 中的公式将使用此数量而不是 cf_id = 32 中指示的数量。

现在我试图将这些变量移到公式之外。 我做了一个项目 (Project_id = 22),我想在其中将这些变量保存为问题。

我是这样想象的:

我想在项目 11 的问题 cf_id = 34 中编译现在包含在我的公式中的相同哈希值,但是自动从项目 22 的问题中编译,同时考虑到类别。

到目前为止,我所做的只是从项目22的此类问题中找到已知产品的价格。

price = Project.find(22).issues.where(subject: "Pineapples").first.try(:custom_field_value,41)

但这没有任何帮助,需要在添加每个新产品时更改代码。

我是编程新手 Ruby,所以我正在尝试 Redmine classes,并尝试用这样的代码编译哈希:

Issue.by_category(Project.find(22))

但结果,到目前为止我只收到了这个:

[{"status_id"=>"27", "closed"=>true, "category_id"=>"1", "total"=>"10"}]

这和我期待的结果完全不一样。 任何帮助都会有所帮助!

UPD. 现在,我的变量(产品价格和重量限制)在一个散列中,它直接是计算字段 34 代码的一部分。但我不希望这些变量(价格和重量限制)成为代码的一部分。我想在单独的项目 (22) 中将它们作为具有相应自定义字段(41 和 42)的问题进行管理 - 这样普通用户就可以在问题中更改或添加这些值,而无需更改计算的自定义字段的代码(34)。所以我想根据项目 22 的问题编译该哈希,而不是直接编写它。我假设是这样的,即项目 22 的主题应该成为自定义字段 [41,41] 的键和数组 - 值。这样做时,我需要两个由分配的类别("goods_by_weight" 和 "goods_by_pieces")确定的单独哈希值,因为它们的计算方式不同,在项目 22 中,我将其他变量写为问题中自定义字段的值不同的类别。

我通过以下方式解决了这个问题。

按照计划,现在我将产品价目表作为问题存储在单独的项目 (ID 22) 中。要在计算的自定义字段的公式中获取所选类别 (A) 的所有产品的价格散列,如果是项目问题 (ID 11),我执行以下操作:

PRICELIST_PROJECT_ID = 22
CATEGORY_A_ID = 1
PRICE_VALUE_CFID = 41
WLIMIT_VALUE_CFID = 42
delimiter = ','

pricelist_issues_cat_a = Project.find(PRICELIST_PROJECT_ID).issues.select { |rate| rate.category_id == CATEGORY_A_ID }
cata_products_names = []
cata_products_pvalues = []
for i in (0..pricelist_issues_cat_a.size-1) do
  cata_products_names[i] = pricelist_issues_cat_a[i].try(:subject)
  cata_products_pvalues[i] = pricelist_issues_cat_a[i].try(:custom_field_value,PRICE_VALUE_CFID).split(Regexp.union(delimiter)).map(&:to_f)
end

cata_price_hash = Hash[cata_products_names.zip(cata_products_pvalues)]

产品类别 B 的方法相同。

不确定这是否是最有效的方法,但它对我有用。