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 通过三个关联查询?的主要内容,如果未能解决你的问题,请参考以下文章

审计与 Rails Audited gem 的深度关联

Ruby on Rails - ActiveRecord 关联问题:查询未正确进行(单数与复数?)

为此使用啥 Rails-ActiveRecord 关联?

Rails 中的表关联 - ActiveRecord

如何将记录添加到has_many:通过rails中的关联

Rails ActiveRecord - 获取与锁定的belongs_to关联