我对Rails相当陌生,我很好奇一些专家在需要构建包含许多条件的非常复杂的SQL查询时正在使用的约定.具体来说,保持代码可读和可维护.
我可以想到几种方法:
单行,在调用find()时:
@pitchers = Pitcher.find(:all, "")
使用预定义的字符串并将其传递给:
@pitchers = Pitcher.find(:all, @conditions)
使用私有成员函数返回查询
@pitchers = Pitcher.find(:all, conditionfunction)
我更倾向于私有成员函数约定,另外因为您可以传入参数来自定义查询.
有什么想法吗?
我几乎从不传递条件find
.通常,这些条件对于以模型的形式named_scope
甚至只是类方法添加到对象模型是有价值的.命名范围很好,因为你可以链接它们,这需要一点点复杂性.它们还允许您传递参数.
此外,您几乎不应该只传递原始SQL条件字符串.您应该使用散列样式(:conditions => { :name => 'Pat' }
)或数组样式(['name = ?', 'Pat']
).这样,SQL就会被转义,为SQL注入攻击提供一些保护.
最后,我认为你正在考虑的方法,你试图在你正在调用的任何环境中创造条件的find
方法是一种有缺陷的方法.模型的工作是提供一个接口,通过该接口返回相关的响应.find
如果你问我,试图确定传入调用的条件太接近底层实现了.而且它更难测试.