找到“anded”数组

时间:2011-05-19 08:05:32

标签: ruby-on-rails ruby-on-rails-3

我有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

2 个答案:

答案 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已经从数据库加载了。