我有以下功能。它有效,但我不喜欢它的样子。
# 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
这可以进一步简化吗?
答案 0 :(得分:1)
如果您设置了很多关系,则可以通过合并范围来过滤掉这些请求。
class User
has_many :applications
def awarded_requests
Request.joins(:applications).merge(applications.accepted)
end
end
请注意,applications.accepted
不是记录数组,而是范围。这就是Active Record在内部表示SQL查询的一部分的方式,因此它可以巧妙地组合其中的一些。