Ruby on rails Rails:基于关联值的ActiveRecord查询

Ruby on rails Rails:基于关联值的ActiveRecord查询,ruby-on-rails,ruby,activerecord,associations,Ruby On Rails,Ruby,Activerecord,Associations,我有两个模型报表和服务器,它们具有属于多个关系。我使用delegate创建了一个访问器方法,该方法允许报表查找与其关联的服务器。公司id。现在,我想在Report上运行一个查询,该查询允许我查找与具有特定公司id属性5的特定服务器相关联的所有Report 这是我的两个模型。是的,我知道当前查询不起作用,因为报告没有属性公司id 不,我不想将公司id存储在报告中,因为该信息不属于报告 报告 class Report < ActiveRecord::Base belongs_to :ser

我有两个模型<代码>报表和<代码>服务器,它们具有属于多个关系。我使用
delegate
创建了一个访问器方法,该方法允许
报表
查找与其关联的
服务器。公司id
。现在,我想在
Report
上运行一个查询,该查询允许我查找与具有特定
公司id
属性5的特定
服务器相关联的所有
Report

这是我的两个模型。是的,我知道当前查询不起作用,因为
报告
没有属性
公司id

不,我不想将
公司id
存储在
报告
中,因为该信息不属于
报告

报告

class Report < ActiveRecord::Base

 belongs_to :server

 delegate :company_id, :to => :server

    class << self

        def method(url, base_url)
            #Report.where(company_id: 5)
        end
    end

end
类报告:服务器

class这应该可以做到

Report.joins(:server).where('servers.company_id = ?', 5)
您还可以像这样添加一个范围

scope :with_company_id, lambda {|id| joins(:server).where('servers.company_id = ?', id) }
然后写

Report.with_company_id(5)

您可以执行如下查询:

Report.joins(:servers).where(:servers => {:company_id => 5})

对我来说,这是原始SQL的更干净的解决方案。

服务器.where(company_id:5).first.reports

我使用的是Rails 4.1.7,可接受的答案对我不起作用。你的工作是什么

Report.joins(:server).where(:servers => {:company_id => 5})

请注意,区别在于where子句中的键是复数的(:servers而不是:server)

您不需要
。所有的
都在末尾。第二个“server”实例,“.where(:server…”应改为“.where(:servers…””。它需要复数形式,因为它是表的名称。有时,并非所有记录在数据库中都有关联关系,例如。在这种情况下,并非所有报表都属于服务器。使用
。联接(:servers)在这种情况下,
将只返回不属于
服务器的报告。如果要返回所有报告,而不管它们与服务器的实际数据库关系如何,请使用
。包含(:服务器)
。缺点:速度稍慢(显然)。这应该与任何类型的
预加载
包含
一起使用,还是像这样执行?谢谢。Rails 4.2.5上的相同Rails 5.1.6上的相同:)Rails 6.0.0上的相同。遗憾的是,这在Rails 6上对我不起作用。我得到的
ActiveRecord::语句无效(PG::UnfinedColumn:错误:column servers.company\u id不存在)
因为你没有回答他的问题。没有什么比回答不同问题的人更糟糕的了。“我在哪里可以买到热狗?”“你不应该吃热狗,因为热狗不健康,所以去农贸市场买生菜。”。这不是答案。你的答案没有告诉他如何按公司id在Report类上搜索,这正是OP想要的。我认为
where
字符串中的“server”应该是复数。最好的答案是,它还处理不平等
Report.joins(:server).where(:servers => {:company_id => 5})