首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索和比较ActiveRecord属性以查找最大值

搜索和比较ActiveRecord属性以查找最大值
EN

Stack Overflow用户
提问于 2010-05-04 11:44:48
回答 2查看 631关注 0票数 0

我有一个模型,看起来像这样:

代码语言:javascript
复制
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的百分比最高。到目前为止,我已经尝试在属性和百分比的基础上创建散列,然后对散列进行排序(见下文),但感觉必须有一种更干净的方法。

代码语言:javascript
复制
  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

有什么想法吗?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2010-05-04 13:13:03

要在数据库中现有行的列中查找最大值,请执行以下操作:

代码语言:javascript
复制
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

如果您正在尝试查找当前模型实例中的顶级食物类型,那么

代码语言:javascript
复制
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

现在,您可以执行以下操作:

代码语言:javascript
复制
d = Diet.new
....
....
....
d.top_food_type # carrots
d.top_food_type_percentage # 50
票数 1
EN

Stack Overflow用户

发布于 2010-05-04 12:45:51

我假设food_percentage是列

如果你只是想找出ref this

代码语言:javascript
复制
Diet.maximum('food_percentage') # gives 50

或者你想要完整的记录,使用这个

代码语言:javascript
复制
Diet.find(:first, :order=> 'food_percentage DESC', :limit=>1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2762685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档