【问题标题】:Rails3: Is there a way to initialize a model with additional columns (calculated/aggregated) returned from a query?Rails3:有没有办法用查询返回的附加列(计算/聚合)初始化模型?
【发布时间】:2010-11-01 17:42:59
【问题描述】:

情况

所以这是我的情况的简化版本:

我有一个付款模式。它具有以下属性:

  • 付款金额
  • 付款日期

我有一个交易模型。它具有以下属性:

  • 交易说明
  • 交易金额
  • 付款 ID

注意事项:

  • 一次付款可应用于多笔交易(即一次付款has_many 交易)。
  • 可以通过将属于付款的每笔交易的交易金额相加来计算付款的余额。

我目前正在使用 SQL join、group 和 sum 聚合函数计算余额。我为我的付款模型添加了一个范围来执行此操作:

scope :all_with_balances, 
  select("payments.*, (payments.payment_amount - sum(transactions.transaction_amount) as remaining_balance").
  joins("LEFT JOIN transactions ON payments.id = transactions.payment_id").
  group(<list of payments columns>)

这里需要注意的重要一点是附加列 remaining_balance 由该查询返回,其计算方式如下:(payments.payment_amount - sum(transactions.transaction_amount) as remaining_balance

问题

使用这个范围,支付模型被实例化/初始化,所有属性都映射到实际的数据库列。但是,我也希望它们使用remaining_balance 的值进行初始化。 这可能吗?

我以为我可以为此列定义一个访问器,但它不起作用。

attr_accessor :remaining_balance

【问题讨论】:

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


    【解决方案1】:

    当您调用命名范围时,ActiveRecord 应将所有列的属性(包括计算的列)附加到结果集中的支付实例:

    payments = Payment.all_with_balances
    balance = payments.first.remaining_balance # should be the value of the aggregate column
    

    这不起作用吗?

    【讨论】:

    • 天哪!这是 RTFM 的一个经典例子。谢谢您的帮助!您能否向我指出我可以阅读更多有关此内容的任何资源?我无法在 api.rubyonrails.org/classes/ActiveRecord/Base.html 或 Edge Guides 中找到它。
    • 这是个好问题。这在guides.rubyonrails.org/active_record_querying.html,第 2.5 节中有所暗示,其中说 ActiveRecordBase#select 最终“使用您选择的字段初始化模型对象”,这表明 AR 不仅仅是像您一样返回模型实例数组可能会期待。在 Agile Web Development with Rails, 2nd Ed 中也有更详细的解释。在 19.3 “高级属性”中
    • 啊。是的,guides.rubyonrails.org 在这个问题上有点含糊。我得去拿那本书。无论如何,感谢您的帮助!这一直困扰着我最长的时间。再次感谢!
    • 哈哈,我才意识到你前几天晚上回答了我的另一个问题。关于我的错字blankblank? 的一个。
    猜你喜欢
    • 2019-04-13
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多