我有一个像这样的命名作用域。。。
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:多次指定表名“profiles”
:选择avg(“answers.rating”)作为avg_rating,profiles.career AS profiles_career FROM“answers”LEFT OUTER JOIN“survey_sessions”survey_sessions_answers“.id=”answers“.survey_session_id LEFT OUTER JOIN”profiles“.id=”survey_sessions_answers“.profile_id INNER JOIN”survey_sessions“.id=”answers“.survey_session_id INNER在“profiles”上加入“profiles”。id=“survey_sessions”。profile_id WHERE(“profiles”。“gender”=E'm')按profiles分组。career
这有点难读,但说我包括两次表配置文件。
如果我只是将include从average中移除,它可以工作,但实际上并不实际,因为average实际上是在一个传递了作用域的方法内部调用的。因此,有时性别或平均数可能会被要求与对方,如果其中一个是失踪的个人资料,包括它不会工作。
所以,要么我需要知道如何修复Rails中的这个明显的错误,要么找出一种方法来知道哪些作用域被应用到了ActiveRecord::NamedScope::Scope对象,这样我就可以检查它们是否已经被应用,如果没有添加include for average。
最佳答案
看来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/