当我必须在多态关联上加入另一个 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')
鉴于成员发送的评估和消息,我想查找与具有特定电子邮件的成员关联的所有日志。我 运行 陷入加入多态关联的问题 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')