【问题标题】:Deferring Attributes To Association将属性推迟到关联
【发布时间】:2013-12-04 23:00:41
【问题描述】:

我有一个 ActiveRecord 模型(我将称为 owner),它实际上是另一种模型的容器(我将称为 posession)通过关联存储在has_many 中。实际上,它的几乎所有属性都基于其许多拥有的累积数据。

例如,它需要一个开始和结束年份,这将基于其所有权的最早和最近年份。它还需要有一个 tags 关联,该关联由来自其所有 posessions 的所有 tags 组成。所以实际上所有 owner 都是来自其所有 posessions 的数据的枚举。

我应该如何处理?我需要 owners 可以使用 *pg_search* 进行搜索,因此我不能简单地使用虚拟属性作为访问器来枚举 posessions 的属性,这将非常昂贵。

我是否应该让 owner 在保存 posession 时重新计算其属性,以便每次更改时只重新计算一次,而不是每次需要时重新计算?

我不知道如何处理这个问题,所以任何建议都将不胜感激。

【问题讨论】:

  • 你看过使用联接吗?
  • @HeliosdeGuerra 请您详细说明一下?

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord associations


【解决方案1】:

您是否考虑过使用 SQL 连接?比如:

@owners = Owner.find(
  :all,
  :select => 'owners.*, sum(possessions.amount) as total_amount',
  :joins => 'left outer join possessions on possessions.owner_id = owners.id',
  :conditions => { 'owners.active => false },
  :group => 'owners.id',
  :order => 'owners.name'
)

这为您提供了与您在 select 调用中定义的额外属性的 ActiveRecord 关系,因此在这种情况下,您可以将总和作为普通属性访问,例如

@owners.first.total_amount

不太确定 pg_search 是如何工作的,但它似乎与 SQL 连接兼容?

编辑:哎呀,最初的发现应该在 Owner,而不是 Possession。

【讨论】:

  • 谢谢。我猜这种方法的问题是属性仅在此查询返回的 ActiveRecord 实例上可用。当pg_search 或其他 Gem 构建自己的查询时,它不会使用连接,因此不会添加这些属性。
猜你喜欢
  • 2011-04-05
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
相关资源
最近更新 更多