通过在模型-rails中拆分属性的内容进行搜索

时间:2016-02-16 09:56:18

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

我的模型Lodging有一个属性price_range此属性包含此格式的数据89;149(字符串格式)说这是现在我想要的89到149之间的价格区间搜索价格范围介于lodgings之间的那些100-200我希望通过单行查询执行此操作与Lodging.where(...一样,是否有任何方法可以解决我的查询?

谢谢!

2 个答案:

答案 0 :(得分:1)

抱歉,这是一个糟糕的数据库设计。我建议将您的实现迁移到使用两个db字段(可能是:low_price,high_price)。然后你可以用一个查询进行搜索。

Lodging.where(["low_pric >= ?" AND high_price <= ?], 100, 200)

可能适合你以下可以使用MySQL,但我不是舒尔。我现在无法测试它:

Lodging.
  where(["(CONVERT(SUBSTRING(price_range, 1, LOCATE(';',price_range) -1) USING INTEGER) >= :low_price AND CONVERT(SUBSTRING(price_range, 1, LOCATE(';',price_range) -1) USING INTEGER) <= :low_price) OR (CONVERT(SUBSTRING(price_range, LOCATE(';',price_range) + 1) USING INTEGER) >= :high_price AND CONVERT(SUBSTRING(price_range, LOCATE(';',price_range) + 1) USING INTEGER) <= :high_price)", {:low_price => 100, :high_price => 200}])

答案 1 :(得分:0)

首先,我建议拆分db列或更改列类型(范围!如果使用postgresql)

没有rails样式查询。您必须使用DB QUERY IN where子句。

像(PostgreSQL的),

Lodging.where("cast(regexp_split_to_array(price_range, ';')[0] as int) > 100").where("cast(regexp_split_to_array(price_range, ';')[1] as int) < 200")