1

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

  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:错误:表名“profiles”指定了不止一次: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 左外连接 "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

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

如果我只是从平均值中删除包含它可以工作,但它并不实用,因为平均值实际上是在一个通过范围的方法内部调用的。因此,有时性别或平均值可能会被相互调用,如果其中任何一个丢失了配置文件,那么它就不起作用了。

所以要么我需要知道如何在 Rails 中修复这个明显的错误,要么想办法知道哪些范围应用于 ActiveRecord::NamedScope::Scope 对象,以便我可以检查它们是否已被应用,如果没有添加包括平均值。

4

1 回答 1

2

看起来 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

据推测,它生成了左连接作为获取投影属性的一部分,并生成了内部连接作为获取标准的一部分:如果它为这些表分配别名,这不会是无效的(只是效率低下),但事实并非如此。有没有办法从您的应用程序中指定别名?

于 2010-05-15T12:09:12.237 回答