选择“sum,count,fields”,加入2个表

时间:2014-07-25 15:42:15

标签: ruby-on-rails

我想使用符号和table_name转换此查询,因为我的数据库不在rails标准中。

SELECT v.taux, sum(v.basevat) as tax, sum(v.valuevat) as amountvat, count(t.id)
FROM vatsomething as v
INNER JOIN somethingreceipt as t
ON v.uid_receipt = t.uid
WHERE t.cancelled = 0
GROUP BY v.taux
ORDER BY v.taux ASC;

class Vat < ActiveRecord::Base
  self.table_name = "vatsomething"
  alias_attribute :base, :basevat
  alias_attribute :value, :valuevat
  alias_attribute :rate, :taux
  belongs_to :receipt, foreign_key: 'uid_receipt', primary_key: 'uid'
end

class Receipt < ActiveRecord::Base
  self.table_name = "somethingreceipt"
  has_many :item, foreign_key: 'uid_receipt', primary_key: 'uid'
end

我没有选择权,如果我将此查询分为4个查询,则速度太慢。

我尝试了一些问题:

Vat.joints(:receipt).
select(:rate, sum(:base), sum(:value), count(Receipt.table_name.:id) ).
where(Receipt.table_name => hash_of_conds.rejectblank)

我已经快速尝试采摘,但我不知道我是否可以使用符号。

我知道我的查询非常困难,非标准数据库也没有帮助。

也许,我必须使用const_get ...

你能帮助我吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

不幸的是,您无法使用rails中的旧数据库轻松使用更多railsy方法。您的查询必须最终成为更多SQL才能使其正常运行。 (我和那些想要保留数据库但在轨道上运行的人一起遇到了很多事情)

你试过这个吗?

Vat.joins(:receipt).where("somethingreceipt.cancelled = 0").
group("vatsomething.taux").
select("vatsomething.taux as rate,
         sum(vatsomething.basevat) as tax, 
         sum(vatsomething.valuevat) as amountvat,
         count(somethingreceipt.id) as receipt_count").
order("vatsomething.taux")

这应该会返回您想要的结果。

您必须记住,在运行查询时,别名方法不会更改表中的名称,您仍然必须使用旧表名和列名。

然后,您可以访问ActiveRecord::Relation中每个对象的属性,尽管它们的名称为(#rate#tax#amountvat#receipt_count

范围界定选项非常适合旧版数据库,可以将您的特定查询整合到模型中,从而更轻松地进行更改,而无需在整个应用程序中查找这些查询。

class Vat

   scope :receipt_summary, ->(conditions){
        joins(:receipt).where(conditions).
        group("vatsomething.taux").
        select("vatsomething.taux as rate,
               sum(vatsomething.basevat) as tax, 
               sum(vatsomething.valuevat) as amountvat,
               count(somethingreceipt.id) as receipt_count").
        order("vatsomething.taux")
        }
end

然后,您可以致电Vat.receipt_summary("somethingreceipt.cancelled = 0"),甚至可以致电Vat.receipt_summary({receipt:{cancelled:0}})