如何在rails scope中编写原始sql?

时间:2014-03-26 15:44:28

标签: mysql ruby-on-rails activerecord

这是我的范围。

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。当我将sql执行到mysql时,它会返回数据。

我知道如何在select,where等的帮助下编写范围......

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

1 个答案:

答案 0 :(得分:4)

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

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]而不是数组。