gpt4 book ai didi

ruby-on-rails - 在 Rails 中使用 .where 时保留数组的顺序

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

我将一个 id 数组传递给 Rails 中的 .where,但它的返回方式并没有保留顺序。例如,这是数组:

2.5.1 :043 > company_ids
=> [83, 79, 52, 44, 82]

我正在查找具有这些公司 ID 的所有页面,但返回的页面是按照提供的公司 ID 的顺序返回的。这是我尝试比较的结果:

2.5.1 :044 > Page.where(company_id: company_ids).pluck(:company_id)
(1.1ms) SELECT "pages"."company_id" FROM "pages" WHERE "pages"."company_id" IN ($1, $2, $3, $4, $5) [["company_id", 83], ["company_id", 79], ["company_id", 52], ["company_id", 44], ["company_id", 82]]
=> [83, 82, 52, 44, 79]

我遇到了这个 stackoverflow 帖子 ( ActiveRecord.find(array_of_ids), preserving order ),它似乎提供了一个解决方案,但它对我不起作用。当尝试按照 stackoverflow 帖子中的建议使用 Page.where(company_id: company_ids).order("field(company_id, #{company_ids.join ','})") 时,我得到以下信息错误:

2.5.1 :042 > Page.where(company_id: company_ids).order("field(company_id, #{company_ids.join ','})")
Page Load (2.0ms) SELECT "pages".* FROM "pages" WHERE "pages"."company_id" IN ($1, $2, $3, $4, $5) ORDER BY field(company_id, 83,79,52,44,82) LIMIT $6 [["company_id", 83], ["company_id", 79], ["company_id", 52], ["company_id", 44], ["company_id", 82], ["LIMIT", 11]]
Traceback (most recent call last):
ActiveRecord::StatementInvalid (PG::UndefinedFunction: ERROR: function field(bigint, integer, integer, integer, integer, integer) does not exist)
LINE 1: ...ts"."company_id" IN ($1, $2, $3, $4, $5) ORDER BY field(comp...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
: SELECT "pages".* FROM "pages" WHERE "pages"."company_id" IN ($1, $2, $3, $4, $5) ORDER BY field(company_id, 83,79,52,44,82) LIMIT $6

我只想调用 Pages.where(company_id: company_ids) 并根据提供的 company_ids 的顺序取回页面。

作为解决方法,我正在使用这个:

company_ids = companies.order("full_name ASC").pluck(:id)
pages = []
company_ids.each {|c| pages << Page.find_by(company_id: c)}

但如果有数千条记录,那似乎效率很低。甚至只有数百个。

最佳答案

问题是您使用的是 MySQL 函数(字段),但您使用的 RDBMS 是 PostgreSQL。

您可以尝试 position,使用 company_id 行和串联的 ID 数组:

Page.where(company_id: company_ids).order("position(company_id::text in '#{ids.join(',')}')")

使用:

Page.where(company_id: company_ids).order(Arel.sql("position(company_id::text in '#{ids.join(',')}')"))

如果您收到弃用警告。

还有可能使用 find,如文档中所述,返回的记录与您提供的 ID 的顺序相同。虽然我不知道它是否适用于你的情况。

关于ruby-on-rails - 在 Rails 中使用 .where 时保留数组的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61698971/

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