gpt4 book ai didi

sql - ARel 模仿包含 find_by_sql

转载 作者:行者123 更新时间:2023-12-03 02:45:34 24 4
gpt4 key购买 nike

我有一个 fairly complex sql query我很确定我无法使用 ARel (Rails 3.0.10) 来完成

查看该链接,但它有一些连接和一个 where isn't 子句,我很确定这对于 ARel 来说太复杂了。

然而,我的问题是,在这个查询变得如此复杂之前,通过 ARel,我可以使用 includes 添加我需要的其他模型,以避免 n+1 问题。现在我正在使用 find_by_sql,includes 不起作用。我仍然希望能够获取这些记录并将它们附加到我的模型实例,就像 includes 那样,但我不太确定如何实现这一点。

有人能指出我正确的方向吗?

我还没有尝试将它们加入到同一查询中。我只是不确定它们如何映射到对象(即 ActiveRecord 是否可以将它们正确映射到正确的类)

我知道,当使用 includes ActiveRecord 实际上会进行第二个查询,然后以某种方式将这些行附加到原始查询中的相应实例。有人可以指导我如何做到这一点吗?或者我需要加入同一查询吗?

最佳答案

让我们假设 SQL 确实无法简化为 Arel。并不是所有的东西都可以,而且我们碰巧真的很想保留我们的自定义 find_by_sql 但我们也想使用包含。

那么 preload_associations 就是你的 friend :(针对 Rails 3.1 进行了更新)

class Person
def self.custom_query
friends_and_family = find_by_sql("SELECT * FROM people")
# Rails 3.0 and lower use this:
# preload_associations(friends_and_family, [:car, :kids])
# Rails 3.1 and higher use this:
ActiveRecord::Associations::Preloader.new(friends_and_family, [:car, :kids]).run
friends_and_family
end
end

请注意,3.1 方法要好得多,因为您可以随时应用急切加载。因此,您可以在 Controller 中获取对象,然后在渲染之前,您可以检查格式并立即加载更多关联。这就是我遇到的情况 - html 不需要急切加载,但 .json 需要。

有帮助吗?

关于sql - ARel 模仿包含 find_by_sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7116087/

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