Rails 4在raw activerecord查询中获取列名

时间:2014-05-26 01:22:21

标签: mysql ruby-on-rails ruby activerecord ruby-on-rails-4

我有一些代码如下:

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_salarydd_salary等等都不是PlayerSalary模型中的物理属性。没有办法像salaries.first.fd_salary那样做。有没有办法在Rails 4中更改上面的内容以使其按列名访问值?

2 个答案:

答案 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

我正在寻找另一种方法,但没有运气。