嘿,我所有的代码块都使用了3个模型......
class Buyer < ActiveRecord::Base
has_many :trans
has_many :sellers, :through => :trans
validates :seller_id, presence: true
end
class Seller < ActiveRecord::Base
has_many :trans
has_many :buyers, :through => :trans
validates :buyer_id, presence: true
end
class Tran < ActiveRecord::Base
belongs_to :buyer
validates :buyer_id, presence: true
belongs_to :seller
validates :seller_id, presence: true
end
供应商 - has_many trans,has_many买家通过trans
Trans - belongs_to买家,belongs_to卖家
在我的seller_show视图中,我可以执行以下代码,并成功地向我提供卖家的买家列表,以及他们所有交易的总和。那些好的然而总和显示所有买方的交易,不仅限于与卖方的交易。
我已经尝试了许多不同的方法来尝试限制sell_id = trans.supplier_id(外键)的交易,但似乎无法使其发挥作用。
有人可以帮忙吗?非常感谢你提前!
(仅供参考,&#39;总和&#39;令人困惑的是交易表中托管交易金额的列的标题!)
<ol>
<% @seller.buyers.uniq{|t| t.buyer_id }.sort_by {|su| su.trans.sum(:sum)}.reverse.each do |su| %>
<li><%= su.name %> <%= su.trans.sum(:sum) %></li>
<% end %>
</ol>
答案 0 :(得分:1)
我认为有两种方法可以做到这一点。更简单的方法(虽然排序效率较低),可以将总和汇总为buyer_id
,然后将其注入买家列表中:
<% buyer_sums = @seller.trans.group(:buyer_id).sum(:sum) %>
<% Buyer.where(id: buyer_sums.keys).sort_by {|b| -buyer_sums[b.id]}.each do |buyer| %>
<%= buyer.name %> <%= buyer_sums[buyer.id] %>
<% end %>
第二种方法是与买方一起获取金额:
<% Buyer.joins(:trans).merge(@seller.trans).
select("buyers.*, SUM(`sum`) sums").order('SUM(`sum`)').each do |buyer| %>
<%= buyer.name %> <%= buyer.sums %>
<% end %>
第二种方法的优点是在检索整个集合后您不进行排序,这对于可扩展性尤其重要,特别是与分页相关。
请注意,此处使用的反引号(`)转义字符用于MySQL,但如果不相应,则应替换为相应的DB约定(例如,PostgreSQL的双引号)。或者,使用quote_column_name
方法更智能地执行此操作:)