2017-09-13 48 views
0

下面的代碼用作Postgre查詢,我試圖在我的Rails應用中調用它,並將它分配給一個對象:@agent_monthly_performance。如何將我的postgres查詢轉換爲rails對象?

SELECT user_id AS user_id, 
     to_char(created_at,'Mon-YY') AS year_month, 
     sum(total_amount) AS amount, 
     sum(total_lm) AS lm 
FROM agent_sales 
WHERE created_at > NOW() - INTERVAL '1 year' 
GROUP BY user_id, year_month" 

一旦工作,我可以通過@ agent_monthly_performance.year_month調用它嗎?我知道我通過「AS」命令創建了不在我的模式中的新列。 (例如year_month)。

回答

1

可以使用ActiveRecord::Base.connection.execute在軌道執行行SQL查詢

@agent_monthly_performance = ActiveRecord::Base.connection.execute("SELECT user_id AS user_id, to_char(created_at,'Mon-YY') AS year_month, sum(total_amount) AS amount, sum(total_lm) AS lm FROM agent_sales WHERE created_at > NOW() - INTERVAL '1 year' GROUP BY user_id, year_month").to_a 
+0

你的答案輸出:=>#不太確定如何訪問它。 – Bassman

+0

你只需要在最後添加'.to_a'。我更新答案。 –

+0

完美!這是訣竅!非常感謝! – Bassman

1

MyModel.find_by_sql(query)仍將繼承模型實例。您可能需要檢查它進一步

+0

這工作,但僅適用於USER_ID,可用的屬性在我的桌子上。有沒有辦法輸出我的三個其他SELECT要求? – Bassman

0

你可以這樣做:

sql = <<-SQL 
    SELECT user_id AS user_id, 
     to_char(created_at,'Mon-YY') AS year_month, 
     sum(total_amount) AS amount, 
     sum(total_lm) AS lm 
    FROM agent_sales 
    WHERE created_at > NOW() - INTERVAL '1 year' 
    GROUP BY user_id, year_month 
SQL 

SomeModel.find_by_sql(sql) 
+0

我試過這樣做到我的模型:AgentSale。它不會產生錯誤,但輸出是:[#,#,#]它似乎只選擇模型中的屬性。那麼我的SELECT中的其他3個條目對它有一些計算,我怎麼能得到它輸出呢? – Bassman

+0

看起來您需要將另一個表添加到您的'FROM'語句中。目前,你只是從'agent_sales'中抽取,我猜測它只是一個連接表。 –

+0

我所有的數據都在agent_sales中,是否需要添加其他agent_sales表並將它們結合在一起? – Bassman