我有一些代码如下:
query = <<-EOF
select player_id, first_name, last_name,
max(case when site_id = 1 then salary end) fd_salary,
max(case when site_id = 2 then salary end) dd_salary,
max(case when site_id = 3 then salary end) ss_salary,
max(case when site_id = 4 then salary end) ds_salary,
max(case when site_id = 7 then salary end) dk_salary,
max(case when site_id = 8 then salary end) elite_salary
from player_salaries ps
where ps.gamedate = '2014-05-25'
and sport_id = #{$MLB_SPORT_ID}
group by player_id
EOF
salaries = PlayerSalary.connection.execute(query)
问题是salaries
在这种情况下作为带有值的数组返回。这些查询有点复杂,我使用的名称如fd_salary
,dd_salary
等等都不是PlayerSalary
模型中的物理属性。没有办法像salaries.first.fd_salary
那样做。有没有办法在Rails 4中更改上面的内容以使其按列名访问值?
答案 0 :(得分:3)
您可以使用find_by_sql
:
find_by_sql(sql,binds = [])
对您的数据库执行自定义SQL查询并返回所有结果。结果将作为一个数组返回,并将请求的列封装为您调用此方法的模型的属性。如果您调用
Product.find_by_sql
,则结果将在Product
对象中返回,其中包含您在SQL查询中指定的属性。
所以,如果你这样做了:
salaries = PlayerSalary.find_by_sql(query)
然后你可以说salaries.first.fd_salary
之类的东西。只是不要尝试使用查询中没有的列,或尝试更改返回的PlayerSalary
对象,并期望发生任何有用的事情。
答案 1 :(得分:0)
如果要将记录检索为哈希,使用列名称可直接使用mysql2 adapter:
ActiveRecord::Base.connection.instance_variable_get('@connection').query("SELECT * FROM `users`", as: :hash).first
我正在寻找另一种方法,但没有运气。