扩展SELECT而不删除默认的`*`

时间:2014-10-20 17:33:33

标签: ruby-on-rails ruby scope rails-activerecord

我正在处理一个使用计算列公开范围的gem。实现并不重要,我可以用简单的例子说明我的问题。

查询的默认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"

这里是点击者:我想在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 个答案:

答案 0 :(得分:-1)

您可以将sql字符串传递给select方法,如下所示:User.select(:id,'*')