提问人:Carlos Morales 提问时间:10/22/2023 更新时间:10/23/2023 访问量:57
如何获取符号之间字符串的最大值?
How can I get the maximum value on string between a symbol?
问:
嗨,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
我将不胜感激任何关于它的评论
答:
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 %>
或者,为了使其更易于在视图中阅读和可重用,请在以下位置将此方法添加到模型中:Transformer
app/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;
评论