我有以下查询
@initial_matches = Listing.find_by_sql(["SELECT * FROM listings WHERE industry = ?", current_user.industry])
有没有办法我可以使用每个操作从上面的查询中选择运行另一个SQL查询?我想运行geokit计算来消除某些超出指定距离的列表...
答案 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。