Rails 5应用中如何构建匹配公寓的SQL查询?
修正你的Rails User匹配查询逻辑
你的问题核心是条件判断的方向完全搞反了!当前的查询逻辑是要求用户的配置区间“套住”公寓的单个数值——这只有当用户的最小/最大值完全等于公寓数值时才会匹配,完全违背了你想要的“公寓数值落在用户配置区间内”的需求。
我们需要把条件反转过来,确保:
- 公寓的面积落在用户设置的最小/最大面积区间内
- 公寓的价格落在用户设置的最小/最大价格区间内
- 用户要求的房间数不超过公寓的房间数(如果是严格匹配就改成相等判断)
修正后的类方法
def self.match(size, price, rooms) User.where( "size_min <= ? AND size_max >= ? AND price_min <= ? AND price_max >= ? AND rooms <= ?", size, size, price, price, rooms ) end
逻辑拆解
size_min <= ? AND size_max >= ?:公寓面积size要≥用户设置的最小面积,同时≤用户设置的最大面积price_min <= ? AND price_max >= ?:同理,公寓价格要落在用户设定的价格区间内rooms <= ?:如果用户想要至少N间房,公寓房间数≥N都符合;如果你需要严格匹配N间房,就改成rooms = ?
另外补充个小细节:SQL里的相等判断是=而非==,虽然Rails会兼容,但写成标准SQL语法更稳妥。
用你的示例用户John测试:如果有一间公寓是size:150、price:700、rooms:3,这个查询就会正确匹配到John的配置。
内容的提问来源于stack exchange,提问作者Mark Denn
相关产品推荐
相关产品推荐

