我有以下查询
@initial_matches = Listing.find_by_sql(["SELECT * FROM listings WHERE industry = ?", current_user.industry])
有没有办法可以使用each do 对上述查询中的选择运行另一个SQL 查询?我想运行 geokit 计算来消除超出指定距离的某些列表...
最佳答案
你的问题有点令人困惑。你想使用each..do (ruby) 来进行过滤吗?或者你想使用sql查询。以下是如何让 ruby 进程进行过滤
refined list = @initial_matches.map { |listing|
listing.out_of_bounds? ? nil : listing
}.comact
如果你想使用 sql,你可以简单地将额外的 sql(可能是子选择)添加到你的 Listing.find_by_sql
中。打电话。
如果您想按照评论中的说明进行操作。
block 引用>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 的列表。
编辑:如果此逻辑在 Controller 中完成,您需要分配给
@refined_list
而不是refined_list
因为 View 只能访问 Controller 实例变量(而不是本地变量)。
关于mysql - Rails 中的嵌套 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6837864/