gpt4 book ai didi

ruby-on-rails - 为什么在我调用合并时 ActiveRelation 返回一个数组?

转载 作者:太空宇宙 更新时间:2023-11-03 18:26:12 24 4
gpt4 key购买 nike

我有名为 UserActivityTask 的模型,我可以执行以下操作

> puts Activity.joins(:task).to_sql
SELECT "activities".* FROM "activities" INNER JOIN "tasks" ON "tasks"."id" = "activities"."task_id" ORDER BY date DESC

> puts User.first.shared_tasks.to_sql
SELECT "tasks".* FROM "tasks" INNER JOIN "user_tasks" ON "tasks"."id" = "user_tasks"."task_id" WHERE "user_tasks"."user_id" = 1

但是当我尝试合并两者时,我得到一个数组:

> puts Activity.joins(:task).merge(User.first.shared_tasks).to_sql
NoMethodError: undefined method `to_sql' for []:Array

为什么不返回关系?我需要在其上放置一个 where 子句。

更新:

经过进一步检查,看起来 User.first.shared_tasks 正在立即评估为一组任务。我可以通过添加 order 调用来获得我想要的行为:

> puts Activity.joins(:task).merge(User.first.shared_tasks.order()).to_sql
SELECT "activities".* FROM "activities" INNER JOIN "tasks" ON "tasks"."id" = "activities"."task_id" INNER JOIN "user_tasks" ON "tasks"."id" = "user_tasks"."task_id" WHERE "user_tasks"."user_id" = 1 ORDER BY date DESC

除了添加一个空的 order 之外,是否有更好的方法来防止计算该关系?

最佳答案

每当您在它不响应的关系对象上调用方法时,它会将该方法委托(delegate)给其他类型的对象。在merge的情况下,它会被转换成一个数组。这是通过 ActiveRecord::Delegation module 完成的. each 等一些方法是 explicitly delegated , 和其他如 merge 是通过 method_missing 完成的.

例如,如果您这样做:

Activity.joins(:task).each { |activity| puts activity }

关系将 .each 委托(delegate)给数组(枚举器),本质上是进行转换。

关于ruby-on-rails - 为什么在我调用合并时 ActiveRelation 返回一个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10617838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com