2014-10-20 33 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,'*')