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

pjm*_*rse 9 activerecord ruby-on-rails

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

Book.where("author_id IS ? AND genre_id IS ?", author_id, genre_id)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ale*_*ack 5

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

def self.select_with_params(sql, params = [])
  query = sanitize_sql_array([sql, params].flatten)
  select(query)
end
Run Code Online (Sandbox Code Playgroud)

在AR链接中使用此方法:

User.where(name: 'name').select_with_params("name='%s' and group_id='%s'", "foo'bar", 4)
Run Code Online (Sandbox Code Playgroud)