【发布时间】:2014-03-19 18:43:58
【问题描述】:
就像this question 一样,我希望急切加载另一个对象,然后根据急切加载的对象中的值对列表进行排序。
给定父母Foo和孩子Bar:
class Foo < ActiveRecord::Base
has_many :bar, foreign_key: :foo_name, primary_key: :name
has_one :most_recent_bar, -> { order created at desc }, foreign_key: :foo_name, primary_key: :name
end
class Bar < ActiveRecord::Base
belongs_to :foo, foreign_key: :foo_name, primary_key: :name
end
我希望显示Foos 的列表,然后按Bar.value 和Foo.name 对它们进行排序。我只是在寻找最近创建的Bar,所以它以相反的顺序排序并且限制为1。所以:
@foos = Foo.includes(:most_recent_bar).order('bar.value asc, foo.name asc')
问题:上面的订单声明正在改变most_recent_bar。它对所有Foo.bars 进行排序,然后选择排序列表中最新的。只有这样才能通过Foo.name 对列表进行排序。
问题:如何正确排序这些急切加载的值,使most_recent_bar 合法地是最近创建的,然后根据most_recent_bar.value 排序Foos 列表?
从我的实时代码编辑 SQL:
Foo.includes(:most_recent_bar).order('bars.value asc, name asc')
SQL (7.9ms) SELECT "foos"."id" AS t0_r0, "foos"."name" AS t0_r1, "foos"."created_at" AS t0_r2, "foos"."updated_at" AS t0_r3, "bars"."id" AS t1_r0, "bars"."content" AS t1_r1, "bars"."created_at" AS t1_r2, "bars"."updated_at" AS t1_r3, "bars"."foo_name" AS t1_r4, "bars"."version" AS t1_r5, "bars"."bbj_status" AS t1_r6, "bars"."host" AS t1_r7, "bars"."value" AS t1_r8 FROM "foos" LEFT OUTER JOIN "bars" ON "bars"."foo_name" = "foos"."name" ORDER BY bars.value asc, name asc
在修复后编辑损坏的 SQL 似乎正在寻找两个创建的 ats,我不确定模棱两可的一个来自哪里!
My error SQL Foo.includes(:most_recent_foo).merge(bar.most_recent).order('bars.repo asc')
SQL (0.6ms) SELECT "foos"."id" AS t0_r0, "foos"."name" AS t0_r1, "foos"."created_at" AS t0_r2, "foos"."updated_at" AS t0_r3, "bars"."id" AS t1_r0, "bars"."content" AS t1_r1, "bars"."created_at" AS t1_r2, "bars"."updated_at" AS t1_r3, "bars"."foo_name" AS t1_r4, "bars"."version" AS t1_r5, "bars"."bbj_status" AS t1_r6, "bars"."host" AS t1_r7, "bars"."repo" AS t1_r8 FROM "foos" LEFT OUTER JOIN "bars" ON "bars"."foo_name" = "foos"."name" ORDER BY created_at DESC, bars.created_at desc, bars.repo asc
PG::Error: ERROR: column reference "created_at" is ambiguous
LINE 1: …bars”.”foo_name" = "foos"."name" ORDER BY created_at...
【问题讨论】:
-
你能添加这个查询的 SQL 输出吗?
-
我刚刚做了一个快速搜索和替换,应该可以与 SSCE 一起使用!
标签: ruby-on-rails ruby activerecord ruby-on-rails-4 eager-loading