【问题标题】:Rails Activerecord query through three associations?Rails Activerecord 通过三个关联查询?
【发布时间】: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}) 是关键
  • 乔恩如果想重新发布作为答案,我会很乐意接受它

标签: ruby-on-rails activerecord associations


【解决方案1】:

您将第二个 join 查询添加到 agents 范围内。你需要使用类似下面的东西:

@company.agents.joins(:comments => :business)

如果您需要针对业务添加条件,您可以按如下方式进行:

@company.agents.joins(:comments => :business).where(:businesses => {:account_status => :active})

这样,它会为您正确链接连接查询并将条件添加到适当的表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多