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})