SQL或AREL在Rails中按方法查询

时间:2018-09-25 23:33:55

标签: ruby-on-rails postgresql arel

在rails中,如果我想搜索表中的一列,我只需要进行where搜索,就可以很快得到结果。例如:

openings = Opening.joins(:opening_number).where('opening_numbers.value = ?', value)

但是,现在我需要按方法搜索。例如,这是OpeningNumber模型中的方法:

def to_s
  value || sprintf("%03d", id % 1000)
end

然后我想按此方法的结果进行搜索。我不知道如何通过sqlarel进行操作。我能做的是:

openings = Opening.includes(:opening_number)
  .select { |opening| opening.opening_number.to_s == value }

但是,它比sql查询要慢得多,并且会导致性能问题。

有人知道如何通过sql或arel做到吗?否则,如何提高像sql查询这样的性能?

过去,它使用ferrets和mysql,因此可以对其进行索引和搜索。但是最近我们将mysql转移到了postgresql并删除了ferrets

1 个答案:

答案 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就足够了