【问题标题】:How to order by mulitiple relations sum count如何按多个关系和计数排序
【发布时间】:2013-07-24 10:00:09
【问题描述】:

我正在使用 Rails 3.2.8 进行开发,并希望通过多个关系计数的总和来订购模型。

有一个 Doc 模型,它有许多 subcatrels 和 subinsrels,并且都是 Relation 模型(不是模型关系,一个名为“Relation”的模型)。

doc.rb

class Doc < ActiveRecord::Base
  has_many :denotations
  has_many :instances, :through => :denotations
  has_many :subcatrels, :class_name => 'Relation', :through => :denotations, :source => :subrels
  has_many :subinsrels, :class_name => 'Relation', :through => :instances, :source => :subrels
  scope :pmdocs, where(:sourcedb => 'PubMed')
  .
  .
end

我想通过计数 subcatrels 和 subinsrels 的总和来订购 Doc 模型。

我已尝试在下面订购范围 pmdocs。

Doc.pmdocs.includes([:subcatrels, :subinsrels]).group('docs.id').order('(count(subcatrels.id) + count(subinsrels.id)) DESC')

下面出现错误。

PG::Error: ERROR:  missing FROM-clause entry for table "subcatrels"
LINE 1: SELECT  DISTINCT "docs".id, (count(subcatrels.id) + count(su...

: SELECT  DISTINCT "docs".id, (count(subcatrels.id) + count(subinsrels.id)) AS alias_0 FROM "docs" LEFT OUTER JOIN "denotations" ON "denotations"."doc_id" = "docs"."id" LEFT OUTER JOIN "relations" ON "relations"."subj_id" = "denotations"."id" AND "relations"."subj_type" = 'Denotation' LEFT OUTER JOIN "denotations" "denotations_docs_join" ON "denotations_docs_join"."doc_id" = "docs"."id" LEFT OUTER JOIN "instances" ON "instances"."obj_id" = "denotations_docs_join"."id" LEFT OUTER JOIN "relations" "subinsrels_docs" ON "subinsrels_docs"."subj_id" = "instances"."id" AND "subinsrels_docs"."subj_type" = 'Instance' WHERE "docs"."sourcedb" = 'PubMed' GROUP BY docs.id ORDER BY (count(subcatrels.id) + count(subinsrels.id)) DESC LIMIT 10 OFFSET 0

如何通过count subcatrels和subinsrels的总和来订购Doc模型?

其他模型源代码如下。

denotation.rb

class Denotation < ActiveRecord::Base
  belongs_to :doc
  has_many :instances, :foreign_key => "obj_id", :dependent => :destroy
  has_many :subrels, :class_name => 'Relation', :as => :subj, :dependent => :destroy
  has_many :objrels, :class_name => 'Relation', :as => :obj, :dependent => :destroy
  .
  .
end

instance.rb

class Instance < ActiveRecord::Base
  belongs_to :obj, :class_name => 'Denotation'
  has_many :subrels, :class_name => 'Relation', :as => :subj, :dependent => :destroy
  has_many :objrels, :class_name => 'Relation', :as => :obj, :dependent => :destroy
  .
  .
end

协会图片

【问题讨论】:

  • 可以添加 Rails 生成的 FULL 查询吗?
  • 我在错误消息中添加了完整的 SQL 查询。

标签: sql ruby-on-rails ruby-on-rails-3


【解决方案1】:

如果不是表名,你不能在WHERE 中要求subinsrels.id

【讨论】:

  • 我猜是这样,并且必须编写原始 SQL,例如连接、选择和计数。但是我不知道要加入多个关系,这些关系并不总是具有相同的关系。
  • @MAsuda 抱歉,但您的关联非常复杂,除非您将它们可视化(实体关系图),否则我无法深入研究。
  • 我添加了关联图片,请参考。
猜你喜欢
  • 2014-05-17
  • 2014-08-25
  • 2021-01-25
  • 2011-12-18
  • 2020-04-10
  • 1970-01-01
  • 2013-07-27
  • 2013-12-15
  • 1970-01-01
相关资源
最近更新 更多