Techioz Blog

シンボル間の文字列の最大値を取得するにはどうすればよいですか?

概要

こんにちは、StackOverflow コミュニティです。

次のテーブルには、次のデータ情報を含む 2 つのテーブル “id” (integer) と “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

配列ビューindex.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

それについてコメントをいただければ幸いです

解決策

num_pod 列の値は、すでに書いたとおり、数値のリストではなく文字列です。つまり、値の 1 つだけを表示し、最大値だけを表示するには、まず文字列を部分に分割する必要があります。次に、その部分を浮動小数点数に変換して、比較して最大の値を選択できるようにします。

次の例を見てみましょう。

'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

最後の 2 つのステップは、単に max_by(&:to_f) に簡略化できます。あなたの場合、それらの値を float 値で比較しても問題ありませんが、レンダリングされる文字列値を返すだけです。

これを使用して、ビューを次のように変更すると、期待どおりの結果が得られます。

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

または、ビューで読みやすくして再利用できるようにするには、このメソッドを app/models/transformer.rb の Transformer モデルに追加します。

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

そして、ビューを次のように変更します。

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