【发布时间】:2013-08-20 02:13:55
【问题描述】:
假设我有两个模型:用户和点。
点属于用户。点有一个“数量”。我想在 Point 模型中定义一个返回用户总分的方法。我想这样称呼它:user.points.total
我只是不知道如何在 Point 模型中定义方法,这样我就不必将用户 ID 传递给它。我想有一种简单的方法可以做到这一点,但我的 Googlefu 让我失望了。
【问题讨论】:
标签: ruby-on-rails ruby
假设我有两个模型:用户和点。
点属于用户。点有一个“数量”。我想在 Point 模型中定义一个返回用户总分的方法。我想这样称呼它:user.points.total
我只是不知道如何在 Point 模型中定义方法,这样我就不必将用户 ID 传递给它。我想有一种简单的方法可以做到这一点,但我的 Googlefu 让我失望了。
【问题讨论】:
标签: ruby-on-rails ruby
假设用户模型有
has_many :points
你可以在用户模型中这样做
def total_points
points.sum(:amount)
end
【讨论】:
User.points.total 而不是 User.total。不过谢谢!
user.total_points 没有任何问题,但您可以使用Association Extension 完成您想要的操作
鉴于您想要在 Point 模型中定义的方法,您会想要使用:
class Point
def total
user.points.sum(:amount)
end
end
然后,您可以通过调用 point.total 来获取与给定 point 关联的用户的总分。您无法通过User.points.total 获得总分,因为User 是一个类并且不涉及特定用户。
【讨论】:
undefined method total' for []:ActiveRecord::Relation`。知道为什么会这样吗?
Point 中请求了一个方法,因此您需要通过Point 的一个实例来调用它。
User的实例来调用它,那么另一个答案就是你想要的。
考虑使用#sum,它使用SQL sum 进行聚合。
例如,
person.points.sum('amount')
或
# inside User.rb
def total
points.sum('amount')
end
【讨论】: