Rails 4+:仅从包含的关联

时间:2018-01-05 19:42:02

标签: postgresql ruby-on-rails-4 query-optimization

我有user模型属于account(非常标准)。在每个请求中,我都需要检索current_user,但我还想返回account以减少数据库查询:

# ApplicationController
def current_user
  @current_user ||= User.includes(:account).find_by(auth_token: cookies[:auth_token])
end

def current_account
  @current_account ||= current_user.account
end

这很好用。但是,account记录包含许多我不想总是返回的额外文本数据。更永久的解决方案是将这些额外字段移至名为account_details的新表格,并在accountaccount_details之间进行一对一。

然而,我需要一个短期解决方案,它将提供一些优化,直到我可以重构(完美是一个迭代过程!)。

我想返回current_user中的所有列,但我只想从current_account中选择几列。

我试过了,但我没有工作:

@current_user ||= User.includes(:account).references(:account).select("users.*, account.id, account.uuid").find_by(auth_token: cookies[:auth_token])

当我查看@current_user.account时,它仍会显示包含其值的所有列,而我只想要id, uuid列。

我无法找到使用select(...) includes(:association)的任何明确语法;这是可能的吗?

1 个答案:

答案 0 :(得分:1)

您需要在用户模型中添加额外的关联。

belongs_to :account_columns, -> { select(:id, :uuid) }, class_name: 'Accoun'

此关联应在您的查询中使用。

User.includes(:account_columns)

这是因为Rails无法传递包含查询的选项。

另请考虑在查询中使用加入而非包含,因为它也可满足您的需求。

User.joins(:accounts).select("accounts_ids, accounts.uuid")