如何获取符号之间字符串的最大值?

How can I get the maximum value on string between a symbol?

提问人:Carlos Morales 提问时间:10/22/2023 更新时间:10/23/2023 访问量:57

问:

嗨,StackOverflow 社区。

我有下表,其中包含两个表“id”(整数)和“num_pot”(varchar 255),其中包含以下数据信息:

|transformers|
  |id|  |num_pot|
    1     1.0
    2     2.12/6
    3     5/6/8
    4     2.9/40
    5     2.1

这是 transformer_controller.rb,它显示所有注册表

def index
   @transformers = Transformer.all
end

我正在尝试在我的数组视图索引.html.erb上显示以下信息

<% @transformers.each do |array| %>
  <%= array.num_pot %>
<% end %>

我正在尝试创建代码来检查字符串并比较列num_pot:

|num_pot|
  1.0       # CHECK THE GREATEST VALUE = 1.0
  2.12/6    # CHECK THE GREATEST VALUE = 6
  5/6/8     # CHECK THE GREATEST VALUE = 8
  2.9/40    # CHECK THE GREATEST VALUE = 40
  2.1       # CHECK THE GREATEST VALUE = 2.1

如何显示以下数据(字符串上的最大值):

|num_pot|
  1.0
  6
  8
  40
  2.1

我尝试了使用“max”的以下代码,但出现错误:

<% @transformers.each do |array| %>
  <%= array.num_pot.max(1) %>
<% end %>

undefined method `max' for "2.12/6":String

我将不胜感激任何关于它的评论

Ruby-on-Rails Ruby-on-Rails-4

评论

1赞 Stefan 10/22/2023
根据您的用例,您应该考虑以没有复合值的方式存储数据。(见 1NF)

答:

3赞 spickermann 10/22/2023 #1

列中的值与您已经编写的一样 - 字符串而不是数字列表。这意味着,要仅呈现其中一个值,并且仅呈现其中最大的值,首先需要将字符串拆分为其各个部分。然后将零件转换为浮点数,以便能够比较和选择最大值。num_pod

让我们举个例子:

'5.2/6/8'.split('/')
#=> ['5.2', '6', '8']

'5.2/6/8'.split('/').map(&:to_f)
#=> [5.2, 6, 8]

'5.2/6/8'.split('/').map(&:to_f).max
#=> 8

最后两个步骤可以简化为 ,因为在您的情况下,可以按浮点值比较它们的值,但返回要呈现的字符串值。max_by(&:to_f)

使用此选项,您应该通过将视图更改为以下值来获得预期的结果:

<% @transformers.each do |transformer| %>
  <%= transformer.num_pot.split('/').max_by(&:to_f) %>
<% end %>

或者,为了使其更易于在视图中阅读和可重用,请在以下位置将此方法添加到模型中:Transformerapp/models/transformer.rb

def max_num_pot
  num_pot.split('/').max_by(&:to_f)
end

并将视图更改为:

<% @transformers.each do |transformer| %>
  <%= transformer.max_num_pot %>
<% end %>

评论

0赞 Carlos Morales 10/23/2023
非常感谢,它对我有用。这就是我需要的。
1赞 mechnicov 10/23/2023 #2

在这种情况下,使用 SQL 是怎么回事?

准备控制器内的所有数据

@transformers =
  Transformer
    .select("*, (SELECT max(ary) FROM unnest(string_to_array(num_pot, '/')::numeric[]) AS ary) AS max_value")

并在视图中渲染

<% @transformers.each do |transformer| %>
  <%= array.max_value %>
<% end %>

在这里你可以看到在线数据库小提琴:

https://www.db-fiddle.com/f/hEETjWuvr9sc5k4XfMeH8w/0

以及它是如何工作的:

SELECT
  *, —- select all real columns
  (
    SELECT max(ary) —- select maximum value from array
    FROM unnest( —- convert array to "set of rows"
      string_to_array(num_pot, '/')::numeric[] —- split string by slash to numeric array
    ) AS ary —- alias for array
  ) AS max_value —- select calculated max value as max_value virtual column
FROM transformers;