这是我的范围。
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/