这是我的范围。

scope :abc, -> (start_date, end_date) {
  find_by_sql("select * from xys where created_at >= '#{start_date}' and created_at <= '#{end_date}'")
}

当我使用以下命令执行上述作用域时,它将返回空白数组。
XYZ.abc(start_date, end_date)

上面的命令生成正确的sql,我可以在日志中看到。当我在mysql中执行该sql时,它会返回数据。

我知道如何在选择,位置等的帮助下编写范围...

这里的问题是,我想在范围内编写纯sql。我该怎么写?

最佳答案

正确的方法是使用以下内容:

scope :abc, ->(start_date, end_date) {
  where("created_at >= ? AND created_at <= ?", start_date, end_date)
}

通过调用find_by_sql,您可以将ActiveRecord的范围界定系统与find_by_sql方法混合使用(我只建议对复杂的SQL不建议这样做)。

范围界定实际上是框架的优势之一(例如,您可以轻松地将它们与Object.abc(date, date).some_other_scope组合在一起以创建可读的查询)。

由于您没有进行范围界定,因此不会为您实例化任何模型,并且不会立即查询数据库(这允许您链接作用域)。作用域方法通常返回ActiveRecord::Relation::ActiveRecord_Relation_ [Classname]而不是数组。

关于mysql - 如何在Rails作用域中编写原始SQL?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22666183/

10-16 11:03