【问题标题】:Select * instead of table.* from active record queries从活动记录查询中选择 * 而不是 table.*
【发布时间】:2020-07-13 06:06:37
【问题描述】:

我正在构建一个相当复杂的查询,并且我想尽可能地坚持使用活动记录方法(因为模型中有很多可选范围供以后添加)。

当前代码:

join_sql = "INNER JOIN(SELECT username, user_id FROM external_credentials UNION SELECT username, user_id FROM internal_credentials) ON id = user_id"

User.joins(join_sql)

这会产生以下 SQL:

SELECT  "USERS".* FROM "USERS" INNER JOIN(SELECT username, user_id FROM external_credentials UNION SELECT username, user_id FROM internal_credentials) ON id = user_id FETCH FIRST :a1 ROWS ONLY  [["LIMIT", 11]]

问题是它选择了"USERS".* 而不仅仅是*,所以我不能使用我加入的额外字段。我如何告诉 ActiveRecord 也接受所有联接字段?

【问题讨论】:

  • 应该这样做User.joins(join_sql).select("*")

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


【解决方案1】:

SELECT "USERS".* 是在 ApplicationRecord 对象中调用 joins(或其他一些方法)的结果。当没有明确告知要从哪些表中选择哪些列时,它将从正在访问的模型所属的表中获取所有列。

您可以通过覆盖 select 语句来修改它们:

User.joins(join_sql).select('<whatever you need here>')

【讨论】:

    猜你喜欢
    • 2017-10-22
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多