ActiveRecord` .select`方法可以在`.where`中使用插值字符串吗?

时间:2015-09-17 13:51:49

标签: ruby-on-rails activerecord

ActiveRecord的.where()查询方法支持这样的插值:

Book.where("author_id IS ? AND genre_id IS ?", author_id, genre_id)

.select()方法是否支持类似的插值,或者我们是否需要使用标准的Ruby字符串插值(例如"WHEN genre_id IS #{genre_id} THEN 2")。

(这看起来似乎是一个牵强附会的用例,但基本上我们正在构建一个带有计算字段的查询 - 例如SUM() as sum - 根据每个记录使用不同的值#s字段,通过CASE语句,我们希望避免将值硬编码到查询中。)

我对所有答案感兴趣,但这个特殊的应用程序恰好仍然在Rails 3.2.x上。

1 个答案:

答案 0 :(得分:5)

您可以使用ActiveRecord :: Sanitization之一:

def self.select_with_params(sql, params = [])
  query = sanitize_sql_array([sql, params].flatten)
  select(query)
end

在AR链接中使用此方法:

User.where(name: 'name').select_with_params("name='%s' and group_id='%s'", "foo'bar", 4)