2012-09-15 87 views
1

我有以下功能。它有效,但我不喜欢它的样子。更优雅的方式来写这个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 

这能进一步简化?

+0

请提供您的模型关系,以便我们知道您的表格如何关联。 –

回答

1

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

class User 
    has_many :applications 

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

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

+0

感谢您的回答。 'Request.scoped.merge(applications.accepted)'不起作用,因为它是通过错过连接而来的,但是这段代码让我得到了一个有效的答案。我最终做了'Request.joins(:applications).merge(applications.accepted)'。如果你改变你的答案以符合这一点,我会接受它。 –

+0

我在我的一个项目中查找了这个,连接必须在默认范围内。 –

相关问题