Поиск и сравнение атрибутов ActiveRecord, чтобы найти наибольшее значение - PullRequest
0 голосов
/ 04 мая 2010

У меня есть модель, которая будет выглядеть примерно так:

my_diet = Diet.new
my_diet.food_type_1 = "beef"
my_diet.food_type_1_percentage = 40
my_diet.food_type_2 = "carrots"
my_diet.food_type_2_percentage = 50
my_diet.food_type_3 = "beans"
my_diet.food_type_3_percentage = 5
my_diet.food_type_4 = "chicken"
my_diet.food_type_4_percentage = 5

Мне нужно выяснить, какой из food_type имеет самый высокий процент. До сих пор я пытался создать хэш из значений и процентов, а затем отсортировать хэш (см. Ниже), но кажется, что должен быть более чистый способ сделать это.

  food_type_percentages = { :food_type_1 => my_diet.foo_type_percentage_1_percentage.nil? ? 0 : my_dient.food_type_1_percentage,
                            :food_type_2 => my_diet.foo_type_percentage_2_percentage.nil? ? 0 : my_dient.food_type_2_percentage,
                            :food_type_3 => my_diet.foo_type_percentage_3_percentage.nil? ? 0 : my_dient.food_type_3_percentage,
                            :food_type_4 => my_diet.foo_type_percentage_4_percentage.nil? ? 0 : my_dient.food_type_4_percentage
  }
  food_type_percentages.sort {|a,b| a[1]<=>b[1]}.last

Есть идеи?

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 мая 2010

Чтобы найти максимальное значение среди столбцов существующей строки в БД, выполните следующие действия:

d = Diet.first(:select => "*, GREATEST(
                 food_type_1_percentage, 
                 food_type_2_percentage, 
                 food_type_3_percentage, 
                 food_type_4_percentage) AS top_food_type_percentage,
       CASE GREATEST(
                 food_type_1_percentage, 
                 food_type_2_percentage, 
                 food_type_3_percentage, 
                 food_type_4_percentage)
         WHEN food_type_1_percentage THEN food_type_1
         WHEN food_type_2_percentage THEN food_type_2
         WHEN food_type_3_percentage THEN food_type_3
         WHEN food_type_4_percentage THEN food_type_4
       END AS top_food_type")


d.top_food_type # carrots
d.top_food_type_percentage # 50

Если вы пытаетесь найти тип верхней пищи в текущем экземпляре модели, тогда

class Diet < ActiveRecord::Base

  def top_food_type
    send(top_food_type_col)
  end

  def top_food_type_percentage
    send("#{top_food_type_col}_percentage")
  end

  FOOD_TYPE_COL = %w(food_type_1 food_type_2 food_type_3 food_type_4)

  def top_food_type_col
    @top_food_type_col ||= FOOD_TYPE_COL.sort do |a, b| 
     send("#{a}_percentage") <=> send("#{b}_percentage")
    end.last
  end
end

Теперь вы можете сделать следующее:

d = Diet.new
....
....
....
d.top_food_type # carrots
d.top_food_type_percentage # 50
0 голосов
/ 04 мая 2010

Я предполагаю, что food_percentage - это столбец

, если вы просто хотите узнать ref this

Diet.maximum('food_percentage') # gives 50

ИЛИ вам нужна полная запись, используйте эту

Diet.find(:first, :order=> 'food_percentage DESC', :limit=>1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...