【问题标题】:Self-reference in a Rails ModelRails 模型中的自引用
【发布时间】:2013-08-20 02:13:55
【问题描述】:

假设我有两个模型:用户和点。

点属于用户。点有一个“数量”。我想在 Point 模型中定义一个返回用户总分的方法。我想这样称呼它:user.points.total

我只是不知道如何在 Point 模型中定义方法,这样我就不必将用户 ID 传递给它。我想有一种简单的方法可以做到这一点,但我的 Googlefu 让我失望了。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    假设用户模型有

    has_many :points
    

    你可以在用户模型中这样做

    def total_points
        points.sum(:amount)
    end
    

    【讨论】:

    • 这是我的第一直觉,但我更愿意将其引用为 User.points.total 而不是 User.total。不过谢谢!
    • @TheSciz 我认为user.total_points 没有任何问题,但您可以使用Association Extension 完成您想要的操作
    【解决方案2】:

    鉴于您想要在 Point 模型中定义的方法,您会想要使用:

    class Point
      def total
        user.points.sum(:amount)
      end
    end
    

    然后,您可以通过调用 point.total 来获取与给定 point 关联的用户的总分。您无法通过User.points.total 获得总分,因为User 是一个类并且不涉及特定用户。

    【讨论】:

    • 谢谢@Peter。使用这种方法,我在尝试使用whateveruser.points.total 调用它时遇到以下错误:undefined method total' for []:ActiveRecord::Relation`。知道为什么会这样吗?
    • 对不起,我没有仔细阅读您的评论。由于您在Point 中请求了一个方法,因此您需要通过Point 的一个实例来调用它。
    • 如果你想通过User的实例来调用它,那么另一个答案就是你想要的。
    【解决方案3】:

    考虑使用#sum,它使用SQL sum 进行聚合。

    例如,

    person.points.sum('amount')
    

    # inside User.rb
    def total
      points.sum('amount')
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      相关资源
      最近更新 更多