gpt4 book ai didi

activerecord - 当关系由 finder_sql 定义时急切加载关系 - 忽略 finder_sql 并构建默认的 has_many 查询

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

有一个类(class)叫 Location .我想在单个查询中预加载所有直接子级。

Location类关系定义如下:

has_many :children,
class_name: self,
finder_sql: ->(query) {
self.class.where(%Q{"locations"."ancestry" like '%#{id}'}).to_sql
},
counter_sql: ->(query) {
self.class.where(%Q{"locations"."ancestry" like '%#{id}'}).count.to_sql
}


Location.first.children
Location Load (0.4ms) SELECT "locations".* FROM "locations" LIMIT 1
Location Load (0.3ms) SELECT "locations".* FROM "locations" WHERE ("locations"."ancestry" like '%1')
=> [#<Location id: 2, code: nil, name: "Niger 1349875728.873964", alternative_name: nil, ancestry: "1", coordinates: nil, ancestry_depth: 1>, (...)]

但是当我想优化它并只分两批加载所有内容时:
Location.includes(:children).where(id: [5, 100]).all
Location Load (0.4ms) SELECT "locations".* FROM "locations" WHERE "locations"."id" IN (5, 100)
Location Load (0.2ms) SELECT "locations".* FROM "locations" WHERE "locations"."location_id" IN ('5')
ActiveRecord::StatementInvalid: PG::Error: ERROR: column locations.location_id does not exist
LINE 1: SELECT "locations".* FROM "locations" WHERE "locations"."lo...
^
: SELECT "locations".* FROM "locations" WHERE "locations"."location_id" IN ('5')
from /xxx/.rvm/gems/ruby-1.9.3-p194@gsp/gems/activerecord-3.2.8/lib/active_record/connection_adapters/postgresql_adapter.rb:1158:in `async_exec'

这是 Rails 中的错误,还是我应该以不同的方式定义它?

我也试图在关系上覆盖 find_in_collection ,但它没有影响。

最佳答案

是的,您在那里与 Rails 斗争得有点过火了。在 has_many 上使用条件参数:

has_many :children, class_name: self, conditions: [%Q{"locations"."ancestry" like '%#{id}'}]

还只是想知道在那里使用 like 吗?为什么不测试=?
has_many :children, class_name: self, foreign_key: :ancestry

此外,如果你走那条路,那应该在风格上有一个 _id:
has_many :children, class_name: self, foreign_key: :ancester_id

关于activerecord - 当关系由 finder_sql 定义时急切加载关系 - 忽略 finder_sql 并构建默认的 has_many 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12911564/

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