find_by_sql in Rails, accessing the resulting array

后端 未结 5 1972
日久生厌
日久生厌 2020-12-30 17:09

I\'m trying to run a query in a very quick and dirty way in Rails, without putting the rest of the model in place. I know this is bad practice but I just need a quick resul

5条回答
  •  情书的邮戳
    2020-12-30 17:40

    So, I had a hacky solution for this, but it works great. Create a table that has the same output as your function and reference it, then just call a function that does a find_by_sql to populate the model.

    Create a dummy table:

    CREATE TABLE report.compliance_year (
     id BIGSERIAL,
     year TIMESTAMP,
     compliance NUMERIC(20,2),
     fund_id INT);
    

    Then, create a model that uses the empty table:

    class Visualization::ComplianceByYear < ActiveRecord::Base
        self.table_name = 'report.compliance_year'
        def compliance_by_year(fund_id)
            Visualization::ComplianceByYear.find_by_sql(["
                SELECT year, compliance, fund_id
                  FROM report.usp_compliance_year(ARRAY[?])", fund_id])
        end
    end 
    

    In your controller, you can populate it:

    def visualizations
      @compliancebyyear = Visualization::ComplianceByYear.new()
      @compliancefunds = @compliancebyyear.compliance_by_year(current_group.id)
      binding.pry
    end
    

    Then, you can see it populate with what you need:

    [1] pry(#)> @compliancefunds
    [
    [0] # {
              :year => Mon, 31 Dec 2012 19:00:00 EST -05:00,
        :compliance => 0.93,
           :fund_id => 1
    },
    [1] # {
              :year => Tue, 31 Dec 2013 19:00:00 EST -05:00,
        :compliance => 0.93,
           :fund_id => 4129
    },
    [2] # {
              :year => Wed, 31 Dec 2014 19:00:00 EST -05:00,
        :compliance => 0.93,
           :fund_id => 4129
    }
    ]
    

提交回复
热议问题