当我必须在多态关联上加入另一个 table 时如何查询多态关联?

How to query polymorphic associations when I have to join another table on the polymorphic association?

鉴于成员发送的评估和消息,我想查找与具有特定电子邮件的成员关联的所有日志。我 运行 陷入加入多态关联的问题 EagerLoadPolymorphicError Cannot eagerly load the polymorphic association 。我想我应该加入消费者协会的日志,然后为会员电子邮件添加一个条件。

我正在使用 Rails 6.0.3.7

我的模型如下:

class Assessment
    belongs_to :member, foreign_key: 'sender_id'
    has_one :log, as: :consumer
end

class Message
    belongs_to :member, foreign_key: 'sender_id'
    has_one :log, as: :consumer
end

class Log

   belongs_to :consumer, polymorphic: true
end

class Member
   has_many :assessments
   has_many :messages
end  

我尝试了以下各种形式:

Log.joins(consumer: :member).where(members: {email: 'john@cheese.com'})
#ActiveRecord::EagerLoadPolymorphicError (Cannot eagerly load the polymorphic association :consumer)

然后我想也许我可以做一个 belongs_to :through 但显然这也不好 belongs_to through associations。我正在尝试做的事情是否可行?

您可以尝试使用include,它或许可以处理多态关联。 Join 实际上是在寻找一个不存在的消费者 table。

Log.includes(consumer: :member).where(members: {email: 'john@cheese.com'})

由于没有 table 调用消费者,加入将失败。要解决此问题,您可以编写自定义连接。

试试这个:

member = Member.find_by(email: 'test1@gmail.com')
Log.joins("LEFT JOIN messages ON (messages.id = logs.consumer_id AND consumer_type='Message')")
   .joins("LEFT JOIN assessments ON (assessments.id = logs.consumer_id AND consumer_type='Assessment')")
   .where('messages.member_id = ? or assessments.member_id = ?', member.id, member.id)

您也可以嵌套联接以与成员 table 联接,请注意第二个嵌套联接中的 AS

Log.joins("LEFT JOIN messages ON (messages.id = logs.consumer_id AND consumer_type='Message')")
   .joins("LEFT JOIN assessments ON (assessments.id = logs.consumer_id AND consumer_type='Assessment')")
   .joins('LEFT JOIN members ON members.id = messages.member_id')
   .joins('LEFT JOIN members AS mmbrs ON mmbrs.id = assessments.member_id')
   .where('members.email = ? OR mmbrs.email = ?', 
          'john@cheese.com', 'john@cheese.com')