ruby 我怎样才能得到字符串中一个符号之间的最大值?

c9qzyr3d  于 2023-11-18  发布在  Ruby
关注(0)|答案(2)|浏览(169)

StackOverflow社区
我有两个表“id”(整数)和“num_pot”(varchar 255)与以下数据信息的下表:

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

字符串
下面是Transformer_controller.rb,它显示所有注册表

  1. def index
  2. @transformers = Transformer.all
  3. end


我试图在数组视图index.html.erb上显示以下信息

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


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

  1. |num_pot|
  2. 1.0 # CHECK THE GREATEST VALUE = 1.0
  3. 2.12/6 # CHECK THE GREATEST VALUE = 6
  4. 5/6/8 # CHECK THE GREATEST VALUE = 8
  5. 2.9/40 # CHECK THE GREATEST VALUE = 40
  6. 2.1 # CHECK THE GREATEST VALUE = 2.1


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

  1. |num_pot|
  2. 1.0
  3. 6
  4. 8
  5. 40
  6. 2.1


我尝试了以下代码使用“max”,但我得到了错误:

  1. <% @transformers.each do |array| %>
  2. <%= array.num_pot.max(1) %>
  3. <% end %>
  4. undefined method `max' for "2.12/6":String


我会很感激任何关于它的评论

0wi1tuuw

0wi1tuuw1#

num_pod列中的值就像你已经写过的那样-字符串而不是一个数字列表。这意味着,要只呈现其中一个值,并且只呈现其中最大的值,你首先需要将字符串拆分成几个部分。然后将这些部分转换为浮点数,以便能够比较和选择最大的值。
让我们举个例子:

  1. '5.2/6/8'.split('/')
  2. #=> ['5.2', '6', '8']
  3. '5.2/6/8'.split('/').map(&:to_f)
  4. #=> [5.2, 6, 8]
  5. '5.2/6/8'.split('/').map(&:to_f).max
  6. #=> 8

字符串
最后两个步骤可以简化为max_by(&:to_f),因为在您的情况下,可以通过它们的浮点值比较它们的值,但返回要呈现的字符串值。
使用此方法,您应该通过将视图更改为:

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

或者,为了使其更容易在视图中阅读和可重用,将此方法添加到app/models/transformer.rb中的Transformer模型中:

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


并将视图更改为:

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

展开查看全部
wtlkbnrh

wtlkbnrh2#

在这种情况下使用SQL是什么意思?
在控制器内准备所有数据

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

字符串
并在视图中呈现

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


在这里你可以看到在线DB fiddle:
https://www.db-fiddle.com/f/hEETjWuvr9sc5k4XfMeH8w/0
它是如何工作的:

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

展开查看全部

相关问题