如何设置嵌套的多次通过关系以访问祖父模型上的深层嵌套数据?

How do I set up a nested-has-many-through relationship for accessing deeply nested data on the grandfather model?

我有抽奖,有抽奖券,还有买票的人。我想做的是(从抽奖中),看看谁都买票了

简而言之:抽奖有很多票。门票有-很多买家。

我如何实现这种代理/聚合/展平 a has many of a has many?

这有点棘手,因为您需要指定源 class 和源关联,具体取决于您正在设置的关系端口。

参见:

class Raffle < ActiveRecord::Base
  has_many :raffle_tickets,
    class_name: LineItem::RaffleTicket.name,
    foreign_key: 'reference_id'

  has_many :ticket_purchasers,
    class_name: Buyer.name,
    through: :raffle_tickets,
    source: :purchasers
end

class LineItem::RaffleTicket < LineItem
  belongs_to :raffle, foreign_key: :reference_id

  # has_many :buyer_line_items # defined in LineItem
  has_many :purchasers,
    through: :buyer_line_items,
    source: :buyer
end

class BuyerLineItem < ActiveRecord::Base
  belongs_to :buyer
  belongs_to :line_item # polymorphic
end

这将允许您执行以下操作:

purchasers = Raffle.first.ticket_purchasers
purchasers.map(&:class)
=> [Buyer, Buyer, Buyer, etc...]

以上相当于在抽奖模型上定义如下方法:

def ticket_purchasers
  raffle_tickets.map(&:purchasers).flatten
end