rails中的嵌套sql查询

时间:2011-07-26 23:34:34

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

我有以下查询

@initial_matches = Listing.find_by_sql(["SELECT * FROM listings WHERE industry = ?", current_user.industry])

有没有办法我可以使用每个操作从上面的查询中选择运行另一个SQL查询?我想运行geokit计算来消除某些超出指定距离的列表...

2 个答案:

答案 0 :(得分:1)

你的问题有点令人困惑。你想使用each..do(ruby)进行过滤。或者您想使用SQL查询。以下是如何让ruby进程进行过滤

refined list = @initial_matches.map { |listing|
   listing.out_of_bounds? ? nil : listing
}.comact 

如果您想使用sql,您只需在Listing.find_by_sql电话中添加额外的sql(可能是子选择)。

如果您想按照评论中的说法进行操作。

  
    

WHERE location1.distance_from(location2,:units =>:miles)

  

您正在混合ruby(location1.distance_from(location2, :units=>:miles))和sql(WHERE X > 50)。这很困难,但并非不可能。

但是,如果你必须在ruby中进行距离计算,为什么不在那里进行过滤。所以本着我的第一个例子的精神。

listing2 = some_location_to_filter_by
@refined_list = @initial_matches.map { |listing|
   listing.distance_from(listing2) > 50 ? nil : listing
}.compact 

这将迭代所有列表,仅保留那些超过50的某些预定列表。

编辑:如果在控制器中完成此逻辑,则需要分配给@refined_list而不是refined_list,因为视图只能访问控制器实例变量(而不是本地变量)。

答案 1 :(得分:0)

简而言之,没有。这是因为在初始查询之后,您没有留下关系表或视图,而是留下了一系列activerecord对象。因此,在初始查询之后要进行的任何处理必须采用ruby和activerecord的格式,而不是sql。