Rails Activerecord 通过三个关联查询?
Posted
技术标签:
【中文标题】Rails Activerecord 通过三个关联查询?【英文标题】:Rails Activerecord query through three associations? 【发布时间】:2017-03-20 23:03:32 【问题描述】:Company has_many :agents, Agent belongs_to :company.
Agent has_many :cmets, Comment belongs_to both :agent 和 :business。
业务 has_many :cmets。
什么 ActiveRecord 查询可以找到所有带有公司代理所写评论的企业?
我可以得到一个公司所有代理的所有cmets:
@company.agents.joins(:comments)
使用该查询,我可以提取公司代理评论的所有 business_id:
@company.agents.joins(:comments).pluck(:business_id)
(因此,如果没有其他方法,我可以在给定 ID 数组的情况下使用对 Business 的 second 查询获得所需的企业列表。)
但是,我似乎无法在单个查询中扩展关联链以包括企业,例如,查找公司代理评论的每个企业的业务记录的查询,例如:
@company.agents.joins(:comments).joins(:business)
# 无法将“代理”加入名为“企业”的关联
编辑:
按照 Jon 在 cmets 中的建议尝试了 @company.agents.joins(:comments => :business)
。如果执行 .count() 或 .pluck() 则有效。
如果还需要按业务字段查询,可以这样做:
@company.agents.joins(:comments => :business).where(:businesses => :account_status => :active)
【问题讨论】:
看起来您将第二个join
放到agents
范围内。您是否尝试过这样做:@company.agents.joins(:comments => :business)
?
宾果游戏,是的,谢谢。我以为我试过了,也许我之前弄错了复数/单数。
虽然 @company.agents.joins(:cmets => :business) 仍然不允许然后附加额外的查询,例如 where("business.status = ?", 'active')错误“缺少表“业务”的 FROM 子句条目”
.where(:businesses => :account_status => :active) 是关键
乔恩如果想重新发布作为答案,我会很乐意接受它
【参考方案1】:
您将第二个 join
查询添加到 agents
范围内。你需要使用类似下面的东西:
@company.agents.joins(:comments => :business)
如果您需要针对业务添加条件,您可以按如下方式进行:
@company.agents.joins(:comments => :business).where(:businesses => :account_status => :active)
这样,它会为您正确链接连接查询并将条件添加到适当的表中。
【讨论】:
以上是关于Rails Activerecord 通过三个关联查询?的主要内容,如果未能解决你的问题,请参考以下文章