【问题标题】:Need help on join table, limiting results to only the resource ID在连接表上需要帮助,将结果限制为仅资源 ID
【发布时间】:2014-08-13 03:59:23
【问题描述】:

大家好,我有一段代码使用了 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 视图中,我可以执行以下代码并成功地给我一个卖家买家列表,以及他们所有交易的总和。这一切都很好但是总和显示了所有买方的交易,不限于与卖方的交易。

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

有人可以帮忙吗?非常感谢您!

(仅供参考,'sum' 是 trans 表中托管交易金额的列的标题!)

<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>

【问题讨论】:

    标签: ruby-on-rails ruby


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

    【讨论】:

    • 感谢您抽出宝贵时间回复,这两个问题都出现了错误。第一个得到错误; #<0x54ff9f0>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2015-10-20
    • 2017-08-31
    • 2016-01-13
    相关资源
    最近更新 更多