Ruby on rails Activemodel沿树向上遍历

Ruby on rails Activemodel沿树向上遍历,ruby-on-rails,Ruby On Rails,型号: 让列表下降很容易: 我要做的是显示所有属性route:properties\u path,但仅显示1家公司的属性,并在视图中提供客户端的链接 我有几种解决方案: 在sql中编写RightOuterJoin是在我的开发环境中使用sqlite,因此需要postgress才能使其正常工作 暴力循环:获取该公司的所有客户机,然后在1个哈希中获取每个客户机的所有属性 所以我的问题是,有没有一种更优雅、也许更适合rails的方式来实现这一点,而我却错过了 我已经看过了。但这是我的问题: 我没有拿回财

型号:

让列表下降很容易:

我要做的是显示所有属性route:properties\u path,但仅显示1家公司的属性,并在视图中提供客户端的链接

我有几种解决方案:

在sql中编写RightOuterJoin是在我的开发环境中使用sqlite,因此需要postgress才能使其正常工作 暴力循环:获取该公司的所有客户机,然后在1个哈希中获取每个客户机的所有属性 所以我的问题是,有没有一种更优雅、也许更适合rails的方式来实现这一点,而我却错过了

我已经看过了。但这是我的问题:

我没有拿回财产

解决方案:我很愚蠢,irb/pry只打印第一张记录:


@company.properties可以工作:

您可以使用它,因为它有很多直通功能,rails非常聪明,可以解决这个问题

class Company
  has_many :clients
  has_many :properties, through: :clients
end

class Client
  belongs_to :company
  has_many :properties
end

class Property
  belongs_to :client
end

@company = Company.find(1)
@company.properties
但是如果你也想要一个到客户机的链接,我猜你想要在客户机上循环,并为每个客户机显示属性,所以你想要快速加载

Company.includes(clients: [:properties]).find(1)

我以前一直在探索。但即使使用through::clients,我也只返回公司数据,而不返回属性。还使用了.select,但似乎没有得到结果。。。也许我做错了。你不应该为了急切的装载而需要很多东西。
[4] pry(main)> @company = Company.includes(clients: [:properties]).find(1)                                                                                                       
  Company Load (0.2ms)  SELECT  "companies".* FROM "companies"  WHERE "companies"."id" = ? LIMIT 1  [["id", 1]]                                                                  
  Client Load (3.5ms)  SELECT "clients".* FROM "clients"  WHERE "clients"."company_id" IN (1)                                                                                    
  Property Load (5.9ms)  SELECT "properties".* FROM "properties"  WHERE "properties"."client_id" IN (2, 12)                                                                      
=> #<Company id: 1, name: "coolDEVOPS2", created_at: "2014-10-31 11:05:05", updated_at: "2014-11-25 09:27:38">                                                                   
[5] pry(main)> 
class Company
  has_many :clients
  has_many :properties, through: :clients
end

class Client
  belongs_to :company
  has_many :properties
end

class Property
  belongs_to :client
end

@company = Company.find(1)
@company.properties
Company.includes(clients: [:properties]).find(1)