2015-02-23 3 views
1

Мой запрос выглядит (немного), как это:Как выразить несколькими столами присоединиться к Rails

SELECT 
    t.strategy_id, SUM(t.price*t.qty), p.currency 
FROM 
    trades t, products p 
WHERE 
    t.symbol = p.symbol and 
    (DATE(trade_time) > '2015-01-01' and DATE(trade_time) < DATE(NOW())) 
GROUP 
    BY t.strategy_id, SYMBOL, DATE(trade_time) WITH ROLLUP 

Как бы мне лучше всего выразить это в «Rails-у»? Поскольку результатом является соединение полей из двух таблиц, следует ли создать модель StrategyPnl? Должен ли он произойти из ActiveRecord :: Base? Наверное, нет, потому что нет таблицы для нее, или ...?

Btw, у меня нет связей между этими таблицами, это требование?

Я хотел бы написать что-то вроде:..

stratpnl.select(), где() группа() ....

и получить массив этого нового класса/модели, но я не могу выяснить, как это сделать?

************************* EDIT ******************** *******

Я simplyfying вопрос, так как фактические таблицы не важны в этом вопросе:

Предположим, две таблицы а и в без каких-либо отношений (FK или другой)

SELECT A.FIELD_Y, B.FIELD_X 
FROM A,B 
WHERE A.INTEGER_X > B.INTEGER_Y 
GROUP BY A.NAME 

Есть ли способ выразить этот запрос в Rails с хорошими моделями? Я знаю, что могу это сделать:

@result = ActiveRecord::Base.connection.execute(sql) 

, но это будет только дать мне двумерный массив полей, я предпочел бы использовать ActiveRecords functionalty и относятся к объектам и полям, так как его там.

+0

какая у вас БД? –

+0

MySQL версия 5.6.19 –

+1

Поделитесь модельными отношениями. – Humza

ответ

1

Не зная правильные модели-отношения, вот что вы могли бы сделать с ActiveRecord:

strategies_data = \ 
    Trade. # assuming at least one table has an associated model 
    joins("INNER JOIN products ON products.symbol = trades.symbol"). 
    where("DATE(trade_time) BETWEEN ? AND ?", Date.new(2015, 1, 1), Date.today). 
    group("trades.strategy_id, trades.symbol, DATE(trade_time) WITH ROLLUP"). 
    select("trades.strategy_id AS id, 
      SUM(trades.price*trades.qty) AS strategy_price, 
      products.currency AS currency") 

И потом:

sd = strategies_data.first 
sd.id #=> gives you strategy_id 
sd.strategy_price #=> gives you total price 
sd.currency #=> gives you the currency 

С немного отладки, который должен работать.

Update:

И если вы хотите, чтобы все было правильно семантически, а также (в терминах классов), добавьте этот шаг, если вы хорошо с замедлением:

strategy_columns = %i{id strategy_price currency} 
strategy_struct = Struct.new(*strategy_columns) 
strategies = \ 
    strategies_data.map do |sd| 
    attributes = \ 
     strategy_columns.each_with_object({}) do |attr, hash| 
     hash[attr] = sd.public_send(attr) 
     end 

    strategy_struct.new(attributes) 
    end 
+0

ОК звучит правдоподобно, что именно является стратегией_данных? –

+0

Просто переменная. Выберите свое имя. – Humza

+0

Да, но это примеры торговой модели? Разве я не должен создавать новую модель? –

Смежные вопросы