【问题标题】:SQL or AREL query by method in rails通过 Rails 中的方法查询 SQL 或 AREL
【发布时间】:2018-09-25 23:33:54
【问题描述】:

在rails中,如果我想在table中搜索一列,我只需要做一个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

【问题讨论】:

  • 什么是print_using方法?
  • 刚刚发现print_using是自定义方法,更新了。

标签: ruby-on-rails postgresql arel


【解决方案1】:

所以你基本上是问如何在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 就足够了

【讨论】:

  • 感谢您的回答。虽然这不是我问题的答案,但它专门解决了我的问题。您的答案中有一些错误,当您修复这些错误时,我可以将您的答案标记为正确。
  • 首先,postgresql 没有string 数据类型,您可以使用charvarchartextDoc
  • 其次,format 方法不支持d。您应该使用其他方式格式化,例如lpadDoc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
相关资源
最近更新 更多