簡體   English   中英

如何為 Rails 中的聯合查詢制作 ORM(ActiveRecord)模型

[英]How to make ORM (ActiveRecord) Models for union queries in Rails

我有一個包含一些基本實體的應用程序

帖子帖子有:

  • 喜歡
  • 評論
  • 和評級

然后我有一個 SQL 視圖來查詢所有三個。 有了它,我有一個名為 PostActivityView 之類的模型。 一個帖子有一個活動視圖,所以我可以打電話

@post.activity_view

它返回適當值的集合(來自 Likes、Comments 和 Ratings)。 這一切正常。

我的問題是這會返回一組哈希圖,而不是評論、喜歡和評分。 這是有道理的,因為我的觀點是創建一個新的“with PostEvents as (...)”結果。 我的問題:有沒有辦法概括這些結果並用 ActiveRecord 對象表示它們?

Likes、Comments 和 Ratings 有不同的屬性,所以我在視圖中做了一些別名(comment 有 comment.body 用於文本,而 Ratings 可以有 rating.comments 文本,所以在需要時我將諸如 review.comments 之類的東西重命名為 .body)。 所以我的結果都具有相同的屬性。 似乎我應該能夠創建一個 ActiveRecord 對象,例如 PostEvent ,它只有別名列。 這可能嗎?

我不知道如何做你所描述的。 但是,您真的需要將它們存儲在單獨的表中嗎? 您可以將它們全部保存在一個表中並使用單表繼承( http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Single+table+inheritance )來擁有單獨的類(喜歡、評論、或評級)對於特定行代表的每種類型的事物。 然后常見的東西可以放在父類中,而特定於更細粒度的東西可以進入子類。

聽起來您的情況與此相反,您將單獨的表合並為一個聯合。 我懷疑這很難在 ActiveRecord 本身中實現,因為不同的數據庫對於如何以及何時修改數據庫視圖的內容有不同的規則(即,如果您可以以某種方式創建一個引用您的視圖的 AR 類'正在提議,當你調用 save 時會發生什么?)

聽起來您已經走上了提供視圖的道路,以便在您真正需要帶回不同的對象時,方便地將一組中的所有這些對象作為單一類型的對象進行檢索。

基於此,我會質疑視圖的使用。 我不是你理解的反視圖——出於性能原因,我們在我們的應用程序中大量使用它們來生成只讀報告——但是如果你需要將行作為其正確的對象類型返回,那么我會檢索它們分別作為“喜歡”、“評論”和“評分”。

第一個解決方案是使用 gem場景並使用聯合查詢創建一個activity_views視圖:

create view activity_views
as (
select ...
from likes

union

select ...
from comments

union

select ...
from rating
)

你的數據當然需要是同質的。

暫無
暫無

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

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