我有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
的新表格,并在account
和account_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)
的任何明确语法;这是可能的吗?
答案 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")