gpt4 book ai didi

sql - 非确定性 Rails 关联默认顺序?

转载 作者:行者123 更新时间:2023-12-01 12:43:09 25 4
gpt4 key购买 nike

鉴于以下模型

class Company < ApplicationRecord
has_many :employees, -> { order(rank: :asc)}
end

class Employee < ApplicationRecord
belongs_to :company
end

使用 eager_load 构建查询时,Rails 似乎忽略了默认顺序但在使用 preload 时包括它们...
Company.preload(:employees)
Company Load (0.3ms) SELECT "companies".* FROM "companies"
Employee Load (0.3ms) SELECT "employees".* FROM "employees" WHERE "employees"."company_id" = 1 ORDER BY "employees"."rank" ASC
=> [#<Company:0x00007f808c9e73c0 id: 1, name: "Acme Co">]

^^^ 注意 ORDER BY employees.rank ASC 的“正确”应用
Company.eager_load(:employees)
SQL (0.4ms) SELECT "companies"."id" AS t0_r0, "companies"."name" AS t0_r1, "employees"."id" AS t1_r0, "employees"."name" AS t1_r1, "employees"."rank" AS t1_r2, "employees"."company_id" AS t1_r3 FROM "companies" LEFT OUTER JOIN "employees" ON "employees"."company_id" = "companies"."id"

^^^ 请注意没有任何类型的员工订购

(我想当你考虑它时这是有道理的。如果你有多个关联被加入,所有关联都有自己的默认排序......这甚至如何工作。我也认识到依赖关联中的默认排序顺序是这个例子有点做作,不是最佳实践,但有很多场景我可以看到这是一种有效的方法。)

当您执行类似 Company.includes(:employees).first.employees.first.award_bonus 的操作时,问题似乎出现了。假设这些员工是按等级排序的。如果 Rails 决定使用 preload,这将起作用当包含员工时,但如果 R​​ails 决定使用 eager_load 则不一定有效(员工将按照 DB 实现的默认排序进行排序)

为什么 Rails 甚至允许在关联的默认范围内指定顺序?如果抛出异常,感觉会更好。

最佳答案

为什么 Rails 甚至允许在关联的默认范围内指定顺序?

因为Rails 喜欢provide sharp knives .

The knives provided by the framework are not nearly as sharp as those offered with the language, but some are still plenty keen to cut. We will make no apologies for offering such tools as part of the kit. In fact, we should celebrate having enough faith in the aspirations of our fellow programmers to dare trust them.



也许更符合您的观点,这似乎是一个永远已知且从未得到修复的错误,请参见此处: https://github.com/rails/rails/issues/6769

关于sql - 非确定性 Rails 关联默认顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50990726/

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