加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 21:04:52 所属栏目:百科 来源:网络整理
导读:我试图使用自定义查询的结果(两个地理点之间的距离)作为模型属性.最终目标是能够使用该列过滤和排序行,例如: Model.with_distance(point).order(:distance).first 我最初以为我可以在范围内使用select;这是一个没有消毒的较短版本: scope :with_distance,-
我试图使用自定义查询的结果(两个地理点之间的距离)作为模型属性.最终目标是能够使用该列过滤和排序行,例如:
Model.with_distance(point).order(:distance).first

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

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

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

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

在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 ...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读