需要有关连接表的帮助,仅将结果限制为资源ID

时间:2014-08-12 19:28:26

标签: ruby-on-rails ruby

嘿,我所有的代码块都使用了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>

1 个答案:

答案 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方法更智能地执行此操作:)