【问题标题】:Using ActiveRecord scope for calculation with multiple columns?使用 ActiveRecord 范围进行多列计算?
【发布时间】:2012-02-13 12:58:13
【问题描述】:

我有一个 ActiveRecord 模型,它有两个数据库属性,totalprocessing_fees

它定义了各种范围,例如(仅作为示例):

class Item < ActiveRecord::Base
  scope :completed, joins(:order).where(:orders => {:status => Order::Status::COMPLETED})
  scope :for_client, lambda {|client| where("client_id=?", client.id)}
...etc...
end

我可以轻松地做这样的事情:

Item.completed.for_client(client).sum(:total)

但我想做的是:

Item.completed.for_client(client).calculate(:total - :processing_fees) # obv not valid

有没有办法做这样的事情?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord


    【解决方案1】:

    这样的事情应该可以工作:

    Item.completed.for_client(client).calculate(:sum, "item.total - item.processing_fees")
    

    【讨论】:

    • 嗯,很简单。我没想到你可以在里面放一个表达式。在我看来,文档可能需要更新,因为它说:calculate(operation, column_name, options = {}) This calculates aggregate values in the given column.
    • @dwhsix:文档有时在这些方面有点薄。 Rails 经常允许在这些地方插入一段 sql。通常,通常采用不同类型的参数,例如哈希或数组,其中基本文档仅讨论字段名称的单个符号。这不仅适用于 ActiveRecord。一些帮助器是采用大量不同输入的方法的好例子。
    • 同意。实际上,我再次仔细查看了文档,打算对其进行编辑。它确实有一个 final 简短示例,显示您可以使用 SQL 表达式,但它有点微妙。我认为也许 doc 需要说“column_name 或 SQL 表达式”或类似的东西。我会尽量记住在文档中的某处进行更改。
    猜你喜欢
    • 1970-01-01
    • 2020-06-16
    • 2023-04-03
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多