活动记录上的类方法,其作用类似于作用域

时间:2016-02-14 23:53:45

标签: ruby-on-rails activerecord

我有以下两种模式:用户和成本。 用户有很多费用。成本定义用户的成本/小时,并具有从日期字段。

我想有可能询问像这样的用户的当前费用:

User.last.costs.current

为此,我可以在Cost模型中创建此范围:

scope :current, -> { where('"from" <= ?', Date.today).order('"costs"."from" desc').limit(1) }

这有效,但需要这种语法:

User.last.costs.current.first

我个人不喜欢。

我相信有几种方法可以解决这个问题:

1)向User模型添加一个方法,该方法将获得当前成本。

2)向Cost中添加一个类方法,该方法将获得当前成本。但是,这将导致以下语法获得当前成本:

 Cost.get_current_cost_by_user(User.last)

最后我的问题是:是否可以在Cost模型上创建一个允许我这样做的类方法:

User.last.costs.current

并返回当前费用?

如果不可能实现这个最佳做法:用户模型上的方法或需要用户作为参数的成本上的类方法?

1 个答案:

答案 0 :(得分:0)

是的,你可以这样做,就像User.last.costs.current # => Cost一样。问题是,这也可以像Cost.current一样调用,这没有多大意义。

class Cost < AR
  def self.current
    where('"from" <= ?', Date.today).order('"costs"."from" desc').first
  end
end