【问题标题】:How to make ORM (ActiveRecord) Models for union queries in Rails如何为 Rails 中的联合查询制作 ORM (ActiveRecord) 模型
【发布时间】:2013-11-15 20:37:11
【问题描述】:

我有一个包含一些基本实体的应用程序

帖子 帖子有:

  • 喜欢
  • 评论
  • 和评级

然后我有一个 SQL 视图来查询所有三个。有了这个,我就有了一个名为 PostActivityView 的模型。帖子有一个活动视图,所以我可以调用

@post.activity_view

返回适当值的集合(来自 Likes、Comments 和 Ratings)。这一切正常。

我的问题是这会返回哈希图的集合,而不是评论、喜欢和评分。这是有道理的,因为我的观点是创建一个新的“PostEvents as (...)”结果。我的问题:有没有办法概括这些结果并用 ActiveRecord 对象表示它们?

Likes、Comments 和 Ratings 具有不同的属性,所以我在视图中做了一些别名(comment's have comment.body for text,Ratings 可以有 rating.cmets for text,所以在需要时我将 review.cmets 之类的东西重命名为 .body )。所以我的结果都具有相同的属性。似乎我应该能够制作一个像 PostEvent 这样的 ActiveRecord 对象,它只有别名列。这可能吗?

【问题讨论】:

    标签: sql ruby-on-rails activerecord rails-postgresql sql-view


    【解决方案1】:

    我不知道该怎么做你所描述的。但是,您真的需要将它们存储在单独的表中吗?您可以将它们全部保存在一个表中,并使用单表继承 (http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Single+table+inheritance) 为特定行所代表的每种事物类型提供单独的类(喜欢、评论或评级)。然后普通的东西可以放在父类中,特定于更细粒度的东西可以放在后代类中。

    听起来您的情况与此相反,您正在将单独的表组合成一个联合。我怀疑这在 ActiveRecord 本身中很难实现,因为不同的数据库对于如何以及何时修改数据库视图的内容有不同的规则(即,如果您可以以某种方式创建一个 AR 类以您的方式引用您的视图'正在求婚,当你调用 save 时会发生什么?)

    【讨论】:

      【解决方案2】:

      当您确实需要带回不同的对象时,听起来您已经走上了提供视图的道路,以方便将一组对象中的所有这些对象作为单一类型的对象进行检索。

      基于此,我会质疑视图的使用。我不是反对你理解的观点——出于性能原因,我们经常使用它们在我们的应用程序中生成只读报告——但如果你需要将行作为正确的对象类型返回,那么我会检索它们分别作为“喜欢”、“评论”和“评分”。

      【讨论】:

        【解决方案3】:

        第一个解决方案是使用 gem scenic 并使用联合查询创建一个 activity_views 视图:

        create view activity_views
        as (
        select ...
        from likes
        
        union
        
        select ...
        from comments
        
        union
        
        select ...
        from rating
        )
        

        您的数据当然需要是同质的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-04
          • 1970-01-01
          • 2023-03-11
          • 2016-06-08
          • 1970-01-01
          相关资源
          最近更新 更多