【问题标题】:Preloading has_many association with a subset of records预加载与记录子集的 has_many 关联
【发布时间】:2021-04-02 19:14:23
【问题描述】:

我有一个允许用户对物品进行拍卖和出价的系统。我有这些模型

Item(ID,描述)

User(身份证,姓名)

Bid(id、item_id、user_id、价格)

Sale(id、item_id、seller_id、buyer_id)

class Item < ApplicationRecord
  has_many :bids
end
class User < ApplicationRecord
  has_many :bids
end
class Bid < ApplicationRecord
  belongs_to :user
  belongs_to :item
end
class Sale < ApplicationRecord
  belongs_to :seller, foreign_key: seller_id, class_name: 'User'
  belongs_to :buyer, foreign_key: :buyer_id, class_name: 'User
  belongs_to :item
  has_many :bids, through :item
end

我正在尝试制作一个页面,列出所有最近的销售,并为每笔销售列出最终买家的出价历史记录。

例如:

class SalesController < ApplicationRecord
  def index
    @sales = Sale.all.includes(:item, :bids)
  end
end

index.html.erb:

<% @sales.each do |sale| %>
  <%= sale.item.description %>

  <p>previous bids</p>
   <% sale.bids.select { |bid| bid.user_id == sale.buyer_id }.each do |bid| %>
     <%= bid.price %>
   <% end %>
<% end %>

这很好用,但我必须在控制器中预加载所有的出价。有没有办法只包含所需的子集?我觉得应该可以给Sale添加关联比如has_many :buyer_previous_bids, -&gt; (??), class_name: 'Bid'可以预加载Sale.includes(:buyer_previous_bids)

【问题讨论】:

  • sale.bids 是如何工作的?您似乎没有任何关联将它们联系起来
  • 好点。我已经更新了我的问题。我认为bids 应该是has_many :through :item 关联

标签: ruby-on-rails ruby activerecord


【解决方案1】:

我认为由于您的模型之间的关系,并且无需添加任何其他内容,您就可以通过他们的user_id 和 @987654322 访问出价和项目,INNER JOINing 出价与销售@ 分别是items 通过它们的主键/外键:

Sale.joins("
  INNER JOIN bids b ON b.user_id = sales.buyer_id
  INNER JOIN items i ON i.id = b.item_id
")

【讨论】:

    猜你喜欢
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多