渴望加載的has_many關係比方說,我在滑軌連接到使用STI表的關係,如:Rails的4.2:與STI
class Vehicle < ActiveRecord::Base; end
class Car < Vehicle; end
class Truck < Vehicle; end
class Person < ActiveRecord::Base
has_many :cars
has_many :trucks
has_many :vehicles
end
...我想加載一個Person及其所有汽車和卡車在一個查詢中。這不起作用:
# Generates three queries
p = Person.includes([:cars, trucks]).first
...這是接近的,但這裏沒有運氣:
# Preloads vehicles in one query
p = Person.includes(:vehicles).first
# and this has the correct class (Car or Truck)
p.vehicles.first
# but this still runs another query
p.cars
我可以做這樣的事情在person.rb:
def cars
vehicles.find_all { |v| v.is_a? Car }
end
但後來Person#cars
不再是集合代理,而我像集合代理。
有沒有一個優雅的解決方案呢?
編輯:將此添加到人給我我想要的數組與一個查詢項;這真的非常接近我想要的東西:
def vehicle_hash
@vehicle_hash ||= vehicles.group_by {|v|
v.type.tableize
}
end
%w(cars trucks).each do |assoc|
define_method "#{assoc}_from_hash".to_sym do
vehicle_hash[assoc] || []
end
end
,現在我能做的Person.first.cars_from_hash
(或找到我的非合成用例一個更好的名字)。
是的,表現可能是值得注意的;我正在爲兩個父母中的每一個的六個STI課程做這個工作。嗯......參加assocation_cache的實際關係會涉及什麼? – Nate 2015-02-24 02:32:00
我已經將解決方案的變體添加到頂端。神智清醒?但好奇的是:爲什麼你會改變車輛來採取STI類型? (在我的情況下,我通常會爲每個請求加載所有STI類型。) – Nate 2015-02-24 03:01:53
看起來和任何一樣好。儘管你仍然沒有得到一個關係。我一直在尋找一種解決方案,添加了最少的方法和最少的複雜性。我的口味似乎增加了你的解決方案太多。我也會添加一個編輯。 – evanbikes 2015-02-24 03:46:34