【发布时间】:2017-07-25 12:50:02
【问题描述】:
我有并且反对游乐设施,并且骑属于公司。
我得到一个游乐设施列表
@rides = Ride.where(...)
我现在需要将所有这些游乐设施的公司存储在 @companies 中,我希望每个公司只拥有一次,即使两个游乐设施属于同一公司。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5
我有并且反对游乐设施,并且骑属于公司。
我得到一个游乐设施列表
@rides = Ride.where(...)
我现在需要将所有这些游乐设施的公司存储在 @companies 中,我希望每个公司只拥有一次,即使两个游乐设施属于同一公司。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5
您可以获得所有游乐设施的所有独特公司,如下所示:
@rides = Ride.includes(:company).where(...)
@companies = @rides.map(&:company).uniq
注意:includes 将在单个查询中加载与生成的rides 关联的所有公司(防止 N+1 查询问题)。
【讨论】:
PostgresQL 在完成此类工作方面非常高效,比 Ruby 高得多。
你可以写:
@rides = Ride.includes(:company).where(foo: "bar")
@companies = @rides.distinct.pluck('companies.name')
这将导致 SQL 查询:
SELECT DISTINCT companies.name FROM "rides" LEFT OUTER JOIN "companies" ON "companies"."id" = "rides"."company_id" WHERE (rides.foo IS "bar")
【讨论】: