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