【问题标题】:Sum all attributes in a model?总结模型中的所有属性?
【发布时间】:2018-06-19 20:48:49
【问题描述】:

我很好奇是否有一种简单的方法可以对模型中的所有属性进行求和,而不会使它看起来重复,而不是 DRY。

我有一个捐赠应用程序,这是我总结所有内容的方式:

def self.total_donations
    array = Category.pluck(
    'SUM(toilet_paper)',
    'SUM(dental_hygiene)',
    'SUM(first_aid)',
    'SUM(general_hygiene)',
    'SUM(underwear_socks)',
    'SUM(blankets)',
    'SUM(school_supplies)',
    'SUM(diapers)').flatten.compact
    array.inject(0){|sum, x| sum + x}
end 

这很难看,但我不知道如何在不做这样的事情的情况下将它们全部加起来。

谢谢!

【问题讨论】:

    标签: sql ruby-on-rails ruby activerecord


    【解决方案1】:

    看看这个:

    def self.total_donations
      sum("toilet_paper + dental_hygiene + first_aid + general_hygiene + underwear_socks + blankets + school_supplies + diapers")
    end
    

    生成的SQL:

    SELECT SUM(toilet_paper + dental_hygiene + first_aid + general_hygiene + underwear_socks + blankets + school_supplies + diapers)
    FROM "categories"
    
    • 短(不可能更短)
    • 高效(所有处理都在数据库层完成)

    请注意,在类实例方法中您不必使用Category,因为它是self(假设该方法在Category 模型中)。

    【讨论】:

    • 谢谢安德烈。是否可以肯定地说,无论响应如何,都没有办法写出模型的所有属性?这似乎是必须的。
    • @TylerP3358 查看已编辑的答案,它甚至很短而且非常高效 - 数据库中的所有处理
    • 多么有趣……它返回零? :D 当我第一次写这篇文章时,我实际上尝试过类似的东西。不知道为什么它返回零。看起来很漂亮,而且正确!
    • @TylerP3358 它应该可以工作,因为它是正确的 :) 。通过尝试一次添加一列来测试它。总和应该会增加。
    • 为了好玩,我会补充一点,您可以动态构建字符串并将其传递给求和方法:Category.columns.map(&:name).reject{ |attr| %w(created_at updated_at).include?(attr)}.join(' + ')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2011-10-08
    • 1970-01-01
    • 2021-09-22
    • 2021-12-31
    相关资源
    最近更新 更多