使用我当前的设置,我需要添加一些自定义SQL语句,用Tire Gem来限定一些数据。
我正在使用Rails 3.2和Ruby 1.9.3
在我的列表控制器中,我有以下内容:
@listings = Listing.search()
对于我的Listing.rb,我使用了一些过滤器,例如:
def self.search(params={})
tire.search(load: true, page: params[:page], per_page: 50) do |search|
search.query { string params[:query], :default_operator => "AND" } if params[:query].present?
search.filter :range, posted_at: {lte: DateTime.now}
search.filter :term, "property.rooms_available" => params[:property_rooms_available] if params[:property_rooms_available].present?
search.filter :term, "property.user_state" => params[:property_user_state] if params[:property_user_state].present?
...
end
我需要做的是将这个SQL语句添加到搜索方法中,以便它按照lonitude和latitute进行范围调整。 'coords'通过URL中的参数以
的形式传入http://localhost:3000/listings?coords=51.0000,-01.0000 52.0000,-02.0000
(-01.0000和52.0000之间有一个空格。)
目前我有:
sql = "SELECT title, properties.id, properties.lng,properties.lat from listings WHERE ST_Within(ST_GeometryFromText('POINT(' || lat || ' ' || lng || ')'),ST_GeometryFromText('POLYGON((#{coords}))'));"
我想过尝试通过类似的方式在控制器中进行范围调整?
def self.polyed(coords)
joins(:property).
where("ST_Within(ST_GeometryFromText('POINT(' || properties.lat || ' ' || properties.lng || ')'),ST_GeometryFromText('POLYGON((#{coords}))'))").
select("title, properties.id, properties.lng,properties.lat")
end
这就是......
def index
@listings = Listing.polyed(poly_coordinates).search()
end
它需要通过HTML和json格式将结果作为@listings返回
http://localhost:3000/listings.json?
我已经在使用RABL自动生成json。
这可能吗?
非常感谢提前。
赖安
答案 0 :(得分:0)
一种可能性是在joins
选项中传递选项where
,:load
等。
但是如果你想在Rails代码中过滤返回的结果,一个更好的方法似乎只是用Tire加载记录ID(使用fields
选项来限制返回的字段),然后使用它们在您的SQL查询中。