代码之家  ›  专栏  ›  技术社区  ›  unknownuser

您在Rails中指定复杂SQL查询的惯例是什么?

  •  5
  • unknownuser  · 技术社区  · 17 年前

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

    我可以想到几种方法:

    单行,在find()调用中:

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

    使用预定义的字符串并将其传入:

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

    使用私有成员函数返回查询

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

    我倾向于私有成员函数约定,此外,因为您可以传入参数来定制查询。

    对此有何看法?

    1 回复  |  直到 17 年前
        1
  •  7
  •   nakajima    17 年前

    我几乎从不向 find 通常,这些条件以某种形式添加到对象模型中是有价值的 named_scope 或者甚至只是模型上的一个类方法。命名作用域很好,因为您可以将它们链接起来,这可以减少一点复杂性。它们还允许您传递参数。

    此外,您几乎不应该只传递原始SQL条件字符串。您应该使用哈希样式( :conditions => { :name => 'Pat' } )或数组样式( ['name = ?', 'Pat'] ).这样,SQL就为您转义了,提供了一些针对SQL注入攻击的保护。

    最后,我认为你正在考虑的方法,即你试图在任何你所说的环境中创造条件 找到 这是一种有缺陷的方法。模型的工作是提供一个接口,通过该接口返回相关的响应。试图确定进入某种状态的条件 找到 如果你问我,这个调用离底层实现太近了。而且它更难测试。