我有一组属性,我正在控制器中抓住这个 -
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多个属性来执行此操作,因此我无法在地址中进行硬编码,我需要解决方案是动态的,这一直是我的关键所在。找到解决方案。在此先感谢任何帮助或指导。
答案 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
现在你有一次地址。