在rails中,如果我想搜索表中的一列,我只需要进行where
搜索,就可以很快得到结果。例如:
openings = Opening.joins(:opening_number).where('opening_numbers.value = ?', value)
但是,现在我需要按方法搜索。例如,这是OpeningNumber
模型中的方法:
def to_s
value || sprintf("%03d", id % 1000)
end
然后我想按此方法的结果进行搜索。我不知道如何通过sql
或arel
进行操作。我能做的是:
openings = Opening.includes(:opening_number)
.select { |opening| opening.opening_number.to_s == value }
但是,它比sql查询要慢得多,并且会导致性能问题。
有人知道如何通过sql或arel做到吗?否则,如何提高像sql查询这样的性能?
过去,它使用ferrets
和mysql,因此可以对其进行索引和搜索。但是最近我们将mysql转移到了postgresql并删除了ferrets
。
答案 0 :(得分:2)
因此,您基本上是在问如何在sql where语句中实现value || (id % 1000).print_using("%03d")
逻辑?
直截了当的方法是:
Opening.includes(:opening_number).where("opening_numbers.value = ? OR (format('%03d', (opening_numbers.id % 1000)::string))::integer = ?", value).references(:opening_numbers)
还要检查是否仍然需要使用includes
。仅在这种情况下,joins
就足够了