2014-10-20 74 views
2

我正在研究一個gem,它提供了計算列的作用域。實現並不重要,我可以用簡單的例子來說明我的問題。擴展SELECT而不刪除默認`*`

查詢的默認select*

User.unscoped.to_sql 
# => SELECT "users".* FROM "users" 

然而,一旦明確select完成後,此默認被覆蓋:

User.select(:created_at).to_sql 
# => SELECT created_at FROM "users" 

後續調用是累積:

User.select(:created_at).select(:created_at).to_sql 
# => SELECT created_at, updated_at FROM "users" 

以下是點擊者:我'd想向SELECT子句添加一列,但是,必須保留默認值。如果一個明確的select存在,這工作得很好:

User.select(:created_at).compute_some_column.to_sql 
# => SELECT created_at, "users"."some_column" FROM "users" 

但是,如果沒有明確的select存在,那麼你不會得到任何東西,但計算列:

User.compute_some_column.to_sql 
# => SELECT "users"."some_column" FROM "users" 

好吧,我可以總是包括*在我compute_some_column範圍,但這將是一個醜陋的黑客攻擊可能導致列被提取多次:

User.compute_some_column.compute_another_column.to_sql 
# => SELECT "users".*, "users"."some_column", "users".*, "users"."another_column" FROM "users" 

任何想法如何解決這個問題?

回答

-1

您可以將sql字符串傳遞到select方法,如下所示:User.select(:id,'*')