将 has_many 关系的总和添加到模型的属性中

发布于 2024-11-10 10:54:14 字数 358 浏览 0 评论 0原文

我有以下(简化模型),并希望访问对象的 to_json 方法中的“花费”值,最好作为对象的属性。

class Task < ActiveRecord::Base
  has_many    :hours

  def spent
    self.hours.sum(:spent)
  end
end

有没有一种方法可以在不定义方法和破解 to_json 方法的情况下执行此操作?我一直在寻找一种使用范围的方法或通过破解 after_initialize 方法,但在模型上使用检查或 to_json 时,这些方法都没有提供“已用”值。

我也需要通过关系在使用 has_many 的树上更高的模型上解决这个问题。

I have the following (simplified model) and wish to access the 'spent' value in the to_json method of the object, ideally as an attribute of the object.

class Task < ActiveRecord::Base
  has_many    :hours

  def spent
    self.hours.sum(:spent)
  end
end

Is there a way to do this without defining a method and hacking the to_json method? I've been hunting for a way to use scope or by hacking the after_initialize method, but none of these methods provide a 'spent' value when using inspect or to_json on the model.

I need to solve this on models higher up the tree that use a has_many, through relationship too.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

七七 2024-11-17 10:54:14

您可以使用 :methods 参数来调用 to_json。

object.to_json(:methods => :spent)

http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html

You can use the :methods parameter to to_json call.

object.to_json(:methods => :spent)

http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html

爱*していゐ 2024-11-17 10:54:14

我能找到的最佳解决方案是重写“as_json”方法以包含我需要的属性,或执行所需的逻辑(在本例中是 has_many 关系的总和)。

class Task < ActiveRecord::Base

...

  def as_json(options = { })
    options = {} if options.nil?

    self[:job_id] = self.phase.job_id
    self[:spent] = self.hours.sum(:spent)

    super(options)
  end
end

The best solution I could find to this was overriding the 'as_json' method to include the attributes that I needed, or to perform the logic required, (in this case the sum of the has_many relationship).

class Task < ActiveRecord::Base

...

  def as_json(options = { })
    options = {} if options.nil?

    self[:job_id] = self.phase.job_id
    self[:spent] = self.hours.sum(:spent)

    super(options)
  end
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文