我正在处理一个使用计算列公开范围的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"
任何想法如何解决这个问题?
答案 0 :(得分:-1)
您可以将sql字符串传递给select方法,如下所示:User.select(:id,'*')