gpt4 book ai didi

ruby-on-rails - named_scope + average 导致在 postgresql 上运行的 sql 查询中多次指定表

转载 作者:行者123 更新时间:2023-11-29 13:38:05 24 4
gpt4 key购买 nike

我有一个像这样的命名范围......

  named_scope :gender, lambda { |gender| { :joins => {:survey_session => :profile }, :conditions => { :survey_sessions => { :profiles => { :gender => gender } } } } }

当我调用它时一切正常。

我也有这个平均方法,我称之为...

Answer.average(:rating, :include => {:survey_session => :profile}, :group => "profiles.career")

如果我这样调用它也能正常工作。

但是如果我这样调用它......

Answer.gender('m').average(:rating, :include => {:survey_session => :profile}, :group => "profiles.career")

我明白了......

ActiveRecord::StatementInvalid: PGError: ERROR: table name "profiles" specified more than once : SELECT avg("answers".rating) AS avg_rating, profiles.career AS profiles_career FROM "answers" LEFT OUTER JOIN "survey_sessions" survey_sessions_answers ON "survey_sessions_answers".id = "answers".survey_session_id LEFT OUTER JOIN "profiles" ON "profiles".id = "survey_sessions_answers".profile_id INNER JOIN "survey_sessions" ON "survey_sessions".id = "answers".survey_session_id INNER JOIN "profiles" ON "profiles".id = "survey_sessions".profile_id WHERE ("profiles"."gender" = E'm') GROUP BY profiles.career

这有点难读,但说我包含了两次表格配置文件。

如果我只是从 average 中删除 include ,它可以工作,但它并不实用,因为 average 实际上是在一个方法中调用的,该方法通过了作用域。因此,有时性别或平均水平可能会在没有对方的情况下被调用,如果其中任何一个缺少配置文件包含它就不会工作。

所以要么我需要知道如何修复 Rails 中这个明显的错误,要么找出一种方法来了解对 ActiveRecord::NamedScope::Scope 对象应用了哪些范围,以便我可以检查它们是否已应用如果不添加平均包含。

最佳答案

看起来 ActiveRecord 正在生成一些错误的 SQL:

SELECT avg("answers".rating) AS avg_rating,
profiles.career AS profiles_career
FROM "answers"
LEFT OUTER JOIN "survey_sessions" survey_sessions_answers
ON "survey_sessions_answers".id = "answers".survey_session_id
LEFT OUTER JOIN "profiles"
ON "profiles".id = "survey_sessions_answers".profile_id
INNER JOIN "survey_sessions"
ON "survey_sessions".id = "answers".survey_session_id
INNER JOIN "profiles"
ON "profiles".id = "survey_sessions".profile_id
WHERE ("profiles"."gender" = E'm')
GROUP BY profiles.career

大概它生成了左连接作为获取投影属性的一部分,而内连接作为获取条件的一部分:如果它为这些表分配别名,这不会无效(只是效率低下),但它不会'吨。有没有办法从您的应用中指定别名?

关于ruby-on-rails - named_scope + average 导致在 postgresql 上运行的 sql 查询中多次指定表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2839353/

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