2015-10-06 26 views
1

一個ActiveRelation實例有where_values。在Rails 4.2.2及更早版本下面的代碼使用Rails 4.2.3改變where_values的行爲,如何獲得where_values的有效SQL?

class Post < ActiveRecord::Base 
    scope :staff_picks, -> { where(staff_pick: true) } 
end 

puts Post.staff_picks.where_values[0].to_sql 

PostgreSQL的返回

"posts"."staff_pick" = 't' 

那是正確的。

的Rails 4.2.3打破了這種行爲,同樣的代碼返回

"posts"."staff_pick" = $1 

我如何用Rails 4.2.3和4.2.4一樣有效的SQL?

+0

爲什麼你需要將部分查詢作爲SQL字符串?你想達到什麼目的? – spickermann

+0

我需要將該SQL用於更復雜的查詢。 – joeri

+0

也許有一種比挖掘Arel interals更簡單的方法。您是否考慮過使用['merge'](http://apidock.com/rails/ActiveRecord/SpawnMethods/merge)?你能否提供一個你真正需要做什麼的簡單例子? – spickermann

回答

2

這的確改變了對Rails 4.2.3,但原來的行爲,如果沒有綁定,可以通過更新範圍使用AREL獲得:

class Post < ActiveRecord::Base 
    scope :staff_picks, -> { where(arel_table[:staff_pick].eq(true)) } 
end 

puts Post.staff_picks.where_values[0].to_sql # => "`posts`.`staff_pick` = 1" 

這也是Rails的4.1和Rails向後兼容3.2。

相關問題