2010-05-04 38 views
0

我有一個模型,它看起來像:搜索和比較的ActiveRecord屬性找到最大值

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 

任何想法?

謝謝!

+0

什麼是你的模型真正的樣子? – jdl 2010-05-04 04:29:40

+0

我認爲你的模型重構 - 在這裏很好的解決方案。分割'食物'和'飲食',並使'has_many'的關係。然後使用數據將變得更容易。 – fl00r 2010-05-04 10:24:44

回答

0

我認爲food_percentage是列

,如果你只是想找出裁判this

Diet.maximum('food_percentage') # gives 50 

或者您想完整記錄使用本

Diet.find(:first, :order=> 'food_percentage DESC', :limit=>1) 
+0

不,不幸的是我實際上有4個百分比列(food_type_1_percentage,food_type_2_percentage ....)。 – 2010-05-04 04:55:55

+0

我不知道-1,但這幫助了我。 – bias 2012-05-18 00:40:33

1

要找到之間的最大值DB中現有行的列,請執行以下操作:

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

太棒了,謝謝! – 2010-05-04 05:50:28