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

嘿所有我有一块代码块,使用3个模型……

class Buyer  :trans validates :seller_id, presence: true end class Seller  :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视图中,我可以执行以下代码并成功地向我提供卖家买家的列表,以及他们所有交易的总和。 这一切都很好, 总和显示所有买方的交易,不仅限于与卖方的交易。

我已经尝试了许多不同的方法来尝试限制seller_id = trans.supplier_id(外键)的交易,但似乎无法使其工作。

有人可以帮忙吗? 非常感谢你提前!

(仅供参考,’sum’令人困惑的是交易表中托管交易金额的专栏的标题!)

 

我有两种方法可以做到这一点。 更简单的方法(虽然排序效率较低),可以通过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方法更聪明地做:)