更优雅的方式来编写这个ActiveRecord查询?

时间:2012-09-15 14:31:41

标签: ruby activerecord

我有以下功能。它有效,但我不喜欢它的样子。

# in user.rb
def awarded_requests
  Request.joins('JOIN application ON application.request_id = request.id').where('accepted = true AND application.user_id = ?', self.id)
end

然后我将它重构为显然是改进的东西,但可能不是最简单的形式:

def awarded_requests
  Request.find(self.applications.accepted.map(&:request_id))
end

这可以进一步简化吗?

1 个答案:

答案 0 :(得分:1)

如果您设置了很多关系,则可以通过合并范围来过滤掉这些请求。

class User
  has_many :applications

  def awarded_requests
    Request.joins(:applications).merge(applications.accepted)
  end
end

请注意,applications.accepted不是记录数组,而是范围。这就是Active Record在内部表示SQL查询的一部分的方式,因此它可以巧妙地组合其中的一些。