【问题标题】:Rails 4 get column names in raw activerecord queryRails 4在原始activerecord查询中获取列名
【发布时间】:2014-05-26 01:22:20
【问题描述】:

我有一些代码如下所示:

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 中更改上述内容以使其按列名访问值?

【问题讨论】:

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


    【解决方案1】:

    您可以为此使用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 对象并期望发生任何有用的事情。

    【讨论】:

      【解决方案2】:

      如果你想检索你的记录作为一个哈希,列名你可以直接使用mysql2适配器:

      ActiveRecord::Base.connection.instance_variable_get('@connection').query("SELECT * FROM `users`", as: :hash).first
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 2015-09-04
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多