gpt4 book ai didi

ruby-on-rails - 是否可以在与 SQL 表达式对应的 activerecord 中定义虚拟属性?

转载 作者:行者123 更新时间:2023-12-05 01:11:43 28 4
gpt4 key购买 nike

我在寻找类似虚拟属性的东西,但这可以在数据库级别工作:假设我有一个字段 age我想添加一个“虚拟字段”age_quintile等于 age/5 ,但可以这样说:

Person.select(:age_quintile,"agv(height)").
group(:age_quintile).
order(:age_quintile)

对应于:
  SELECT (age/5) as age_quintile, avg(height) 
FROM persons
GROUP BY (age/5)
ORDER BY (age/5);

或者
Person.maximum(:age_quintile)

对应于
SELECT max(age/5) 
FROM persons;

所以,我想我会在模型中声明这样的属性,比如:
class Person < ActiveRecord::Base
...
magic_attribute :age_quintile, :integer, 'age/5'

end

其中最后一位是 SQL 表达式,类型是从字符串转换所必需的。

有没有办法用 vanilla ActiveRecord 或一些 gem 来做到这一点?

更新

希望在模型中声明这些属性,而不是 - 正如建议的那样 - 在 select 中逐字使用别名表达式的原因是我们希望属性参与通用查询 API 并作为任何其他属性出现在 API 用户面前.所以以下应该是可能的:
class PeopleController < ApplicationController
def search
group_columns = params[:group].split(" ") # age_quintile could be one of
measurements = params[:measurements].split(" ") # height could be one of
aggregates = %w[min avg max]
select_columns = measurement.map{|m|
aggregates.map{|fn| "#{fn}(#{m})"}
}.flatten
render :json => Person.
select( group_columns + select_columns ).
group(group_columns).
search(group_columns)
end
end

和一个查询字符串 ?group=age_quintile&measurements=height会导致:
  SELECT (age/5) as age_quintile, min(height), avg(height), max(height)
FROM persons
GROUP BY (age/5)
ORDER BY (age/5);

最佳答案

这是可能的。更重要的是,它是由 ActiveRecord 自动完成的:

@people = Person.
select('(age/5) as age_quintile, height').
group(:age_quintile).
order(:age_quintile)
person = @people.first
person.age_quintile
# => age_quintile value (person.age / 5)

关于ruby-on-rails - 是否可以在与 SQL 表达式对应的 activerecord 中定义虚拟属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19321340/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com