我想使用符号和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
...
你能帮助我吗?
谢谢。
答案 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}})