1

我有以下功能。它有效,但我不喜欢它的外观。

# 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

这可以进一步简化吗?

4

1 回答 1

1

如果你设置了很多关系,你可以通过合并一个范围来过滤掉那些请求。

class User
  has_many :applications

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

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

于 2012-09-15T15:25:29.860 回答