2009-01-01 66 views
5

我对Rails相当陌生,对于一些专家在构建包含许多条件的非常复杂的SQL查询时使用的一些约定很好奇。具体来说,保持代码的可读性和可维护性。在Rails中指定复杂SQL查询的约定是什么?

有一对夫妇的方法,我能想到的:

单行线,在打电话找():

@pitchers = Pitcher.find(:all, "<conditions>") 

使用预定义的字符串,并传递它:

@pitchers = Pitcher.find(:all, @conditions) 

使用私人会员功能返回查询

@pitchers = Pitcher.find(:all, conditionfunction) 

我倾向于私人成员函数约定,另外,因为您可以传入参数来自定义查询。

对此有何看法?

回答

7

我几乎从不将条件传递给find。通常这些条件对于在模型中以named_scope的形式添加到对象模型或者甚至只是在模型上使用类方法都很有用。命名范围很好,因为你可以链接它们,这需要一点点复杂性。它们也允许你传递参数。

另外,您几乎不应该只传递原始SQL条件字符串。您应该使用散列样式(:conditions => { :name => 'Pat' })或阵列样式(['name = ?', 'Pat'])。通过这种方式,您可以逃脱SQL,为SQL注入攻击提供一些保护。

最后,我认为您正在考虑的方法,您尝试在所调用的任何环境中创建条件的方法是错误的方法。模型的工作是提供一个接口,通过该接口返回相关的响应。如果你问我,试图确定传递给find调用的条件太接近底层实现。再加上它很难测试。

+0

优秀的评论,谢谢! – unknownuser 2009-01-01 20:43:51