我有2个表:entradas (id, blah...)
和georelaciones (:entrada_id, lugar_id, blah...)
。 georelaciones
只是一个多态关系的链接表。
我想检索与每个entradas
相关的所有lugar_id
(传入数组)。
我已经构建了这个丑陋的scope
(“d”将是lugar_id
的数组):
scope :con_pais, lambda {|d|
# select e.id from entradas as e inner join georelaciones as g1 on (g1.lugar_id = 55 and g1.entrada_id = e.id) inner join georelaciones as g2 on (g2.lugar_id = 66 and g2.entrada_id = e.id)
cadena = ""
i = 0
d.each{ |lugar_id| i += 1 ; cadena << " inner join georelaciones as g" + i.to_s + " on (g"+ i.to_s + ".lugar_id = " + lugar_id.to_s + " and g" + i.to_s + ".entrada_id = e.id)"}
entradas = Entrada.find_by_sql("select distinct e.id from entradas as e " + cadena)
a = []
entradas.each{ |e| a << e.id }
Entrada.where("id in (?)", a)
}
我知道这不好,因为我的表entradas
有几百万条记录,而且由于find_by_sql
的使用,我没有利用延迟加载。
如何查询数据库并直接返回ActiveRecord::Relation
而不使用find_by_sql
?
答案 0 :(得分:0)
Entrada.find_by_sql("select distinct e.id from entradas as e " + cadena)
=&GT;
Entrada.select("distinct e.id as e #{cadena}")
答案 1 :(得分:0)
假设我的关系正确,你应该可以这样做:
class Georelacion < ActiveRecord::Base
belongs_to :entrada
scope :con_pais, lambda { |d|
includes(:entrada).where("georelaciones.lugar_id IN (?)", d)
}
...
end
然后在控制器中:
@lugar_ids = [1,2,3,4]
@georelaciones = Georelacion.con_pais(@lugar_ids).group_by(&:lugar_id)
那应该给你一个散列,其中每个键都是一个lugar_id,每个键的值是一个georelaciones数组,相关的entrada已经从数据库加载了。