将一组几乎与Ruby匹配的实例分组

时间:2014-02-07 16:05:58

标签: ruby-on-rails ruby postgresql activerecord ruby-on-rails-4

我有一组属性,我正在控制器中抓住这个 -

def index
  @properties = Property.all
  @properties = @properties.where("bedrooms = ?", params[:bedrooms])            if params[:bedrooms].present?
  @properties = @properties.text_search(params[:query])                         if params[:query].present?
  @properties = @properties.area_search(params[:area])                          if params[:area].present?
  @properties = @properties.where("month_available = ?", params[:availability]) if params[:availability].present?
  @properties = @properties.where("vacancy_status = ?", params[:now])           if params[:now].present?
end

我通过呈现部分显示在我的视图中,现在这是我的问题 -

该视图属于满足上述搜索条件的所有属性,有时这是100多个属性。其中一些属性具有几乎相同的地址,因为它们位于同一建筑物中但具有不同的单元号,不幸的是,单元号附加到我的DB中的:street_address属性(例如123 Main Street B)。当我显示搜索结果时,我只需要显示一次地址(例如123 Main Street)而不是该地址的每个实例(最多可以显示40次)。我必须继续显示符合搜索条件的所有其他属性,这并不是说我只是为单个地址提取数据。通常情况下,我会提取4间卧室等所有房产的数据。

附注:我正在使用从数据库中提取的400多个属性来执行此操作,因此我无法在地址中进行硬编码,我需要解决方案是动态的,这一直是我的关键所在。找到解决方案。在此先感谢任何帮助或指导。

3 个答案:

答案 0 :(得分:2)

给这个例子一个镜头: (我按地址分组除了最后一个字符和剥离。您可以根据您对列出属性的知识来增强分组)

addresses = ["123 main st. A", "123 main st. J", "124 Main street", "123 main st."]

# define how properties are grouped here; don't worry about "weird" groups; they'll only contain one value and we'll get rid of it in the next line
map = addresses.group_by { |a| a[0..-2].strip }
(addresses - map.reject { |k,v| v.length < 2 }.values.flatten).collect { |k| { k => map[k] || k } }

=> [{"124 Main street"=>"124 Main street"},
 {"123 main st."=>["123 main st. A", "123 main st. J"]}]

答案 1 :(得分:1)

如果它只是匹配地址字符串开头的简单文字,则可以使用SQL LIKE

@properties.where("address LIKE ?", "#{params[:address]}%")

我在这里使用%通配符告诉它SQL匹配地址与之后的任何内容,所以:

"123 Main St" will match "123 Main St and anything here"

希望有所帮助。

答案 2 :(得分:0)

如果您只想一次轻松地展示该物业。如何获得前7个(或任何适合您需要的)角色。这样,门牌号码+街道地址的一部分匹配,您只使用此匹配的第一个数据库命中。您还可以获取所有结果,获取前7个字符,然后将它们放入数组中并使用它。

当添加到数组时,只需执行:

    myarray = myarray.uniq

现在你有一次地址。