ruby-on-rails - 在 ActiveRecord 3 中添加自定义 SELECT

标签 ruby-on-rails postgresql activerecord ruby-on-rails-3.2 postgis

我正在尝试使用自定义查询的结果(两个地理点之间的距离)作为模型属性。最终目标是能够使用该列过滤和排序行,例如:

Model.with_distance(point).order(:distance).first

我最初认为我可以在范围内使用 select ;这是一个没有 sanitizer 的较短版本:

scope :with_distance, ->(point) { select("ST_DISTANCE(models.point_in_model, ST_GeographyFromText('#{point.to_s}')) AS distance") }

但是,该范围仅选择 distance 列,而不检索模型属性:

> Model.with_distance(point)
[#<Model >, #<Model >,...]

models.* 添加到 select 调用可以解决问题,但代价是在每个查询中强制检索整行并忽略其他 select 调用。

如何添加 SELECT 子句而不是替换所有子句

最佳答案

除了默认的 SELECT 模型。*,ActiveRecord 通常添加 SELECT 子句,而不是替换它们。

> Project.select(:id).select(:name)
=> Project Load (0.5ms)  SELECT id, name FROM "projects"

显然,当您想要“默认 SELECT 以及我要求的任何其他选择”时,这无济于事。

您可以尝试使用 select_star 范围

scope :select_star, -> { select("models.*") }
scope :select_star, -> { select(self.arel_table[Arel.star]) } # Arel version, if feeling adventurous

您可以在需要所有列的地方使用它吗?

> Model.with_distance(point).select_star
=> SELECT ST_DISTANCE(models.point_in_model, ST_GeographyFromText('0,0')) AS distance, models.* FROM ...

关于ruby-on-rails - 在 ActiveRecord 3 中添加自定义 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28836479/

相关文章:

ruby-on-rails - PGError : ERROR: aggregates not allowed in WHERE clause on a AR query of an object and its has_many objects

javascript - Angular.js 和 DAO 模式

ruby-on-rails - 陷入困境-db:create和db:migrate发生了什么?

ruby-on-rails - 尝试将 root 设置为 devise/sessions#new 会导致路由映射错误

ruby-on-rails - Rails after_create proc 没有给出接收者

postgresql - 如何更改/设置 Postgres 中的 block 大小?有配置文件吗?

mysql - rails 3 : Why is flatten duplicating records with more than one associated record?

java - java中嵌套sql查询错误

ruby-on-rails - Rails - 使用相同的属性名称按日期分组返回不同的答案

mysql - 如何对数百万行运行这个复杂的查询