簡體   English   中英

從原始 sql 查詢聲明 Rails 模型

[英]Declare Rails model from raw sql query

我寫了一個 SQL 函數,它接受一個參數並返回表類型。

SQL 函數 -

create or replace function get_some_data (p_val in number)
  return my_tab_type_coll pipelined as
begin
  FOR i in (select final_test_tb.*,  PERIOD_BETWEEN_TWO_DATES(
    FROM_TZ(CAST(from_date AS TIMESTAMP), 'UTC'),
    FROM_TZ(CAST(to_date AS TIMESTAMP), 'UTC') as period
  from (
    select dl.id, dl.trip_id, dl.address, dl.from_date, dl.avg_speed, dl.high_speed, 
      case when tmp = 2 and nvl(lead(avg_speed) over (order by received_at asc), 1) = 0
      then lead(to_date) over (order by received_at asc)
      else to_date end to_date, tmp
      from (
        select test.*, case when avg_speed <> 0 then 1
                       when nvl(lag(avg_speed) over (order by received_at asc), 1) <> 0 then 2
                       when nvl(lead(avg_speed) over (order by received_at asc), 1) <> 0 then 3
                       end tmp
          from  test
          where foo_id = p_val) dl
      where tmp is not null) final_test_tb
   where tmp in (1, 2)) loop
    pipe row(my_tab_type(i.id, i.foo_id,
 i.avg_speed, i.high_speed, i.distance, i.address_en, i.from_date, i.to_date));
  end loop;
  return;
end;

在這里,我已經創建了兩種類型,即行類型 - my_tab_type 和表類型 -my_tab_type_coll

使用 sql 命令獲取記錄時 =>

select * from TABLE(get_some_data(10003));

是否可以從此函數構建 rails 模型? 這樣,就可以為該模型/表應用過濾器和分頁。

可能的? 是的......但可能是個好主意? 不。

Active Record 非常適合簡單的表。

SQL 函數不是一個很好的匹配,並且可能更難與 Active Record 集成,然后只使用“執行” - 並迭代結果集。

這是一個 StackOverflow 問題,可能會對此有所幫助: Rails 3 execute custom sql query without a model

我會建議一個稍微不同的方法:不是返回一個“臨時表”,而是讓它成為一個真正的表,但添加一列:會話鍵或用戶鍵。

如果表剛剛存在,您可以創建模型。 當您需要數據時,您還可以提供“用戶密鑰”或“會話密鑰”,以便多個會話可以在同一個表中計算內容,但不會相互干擾。

這樣,恕我直言,您可以兩全其美:您的函數可以即時計算數據,但它會插入一個表中,該表充當臨時表,但會持續存在,因此您的模型可以依賴它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM