【问题标题】:Ruby on Rails: Aggregating several columns into an ArrayRuby on Rails:将几列聚合成一个数组
【发布时间】:2011-01-02 01:47:35
【问题描述】:

我正在开发一个 Ruby on Rails 应用程序,其中我的一个数据库表有 10 列(pile_1 到 pile_10)。将模型中的这些列作为 10 元素数组访问会很方便。

感觉我应该能够强迫composed_of 做我想做的事,但我不知道怎么做。谁能启发我,或提出更好的策略?

【问题讨论】:

  • 您是否有权更改架构?
  • 是的。这是个人发展,所以我可以完全掌控。

标签: ruby-on-rails ruby arrays aggregation


【解决方案1】:

def piles
    (1..10).map{ |num| self[ "pile_#{ num }"]}
end

还不够?

【讨论】:

  • 哈。那很整齐。在这种情况下,是的,这应该可以满足我的所有需求,因为我不希望在任何时候都需要 /write/ 到piles_n。大概 Model.[]() 是 ActiveRecord::Base 的一个方法?
  • 为清楚起见,您可能希望使用 read_attribute("pile_#{num}") 代替,但方括号访问器在功能上相似。
【解决方案2】:

既然您有权更改架构,那么您应该这样做。将数组作为单独的列存储在表中是denormalized。你的模式是否被规范化对你来说可能并不重要,但你当前的困难是非规范化模式的直接结果。

你应该做的是创建一个新表,堆,像这样。我将使用 postgres 语法,因为这是我所知道的。我不知道当前包含所有 piles* 列的表的名称,所以我将其称为“foo”:

create table piles (
  id serial primary key,
  foo_id int not null references foo(id),
  value text not null,
);

您现在在 foo 中拥有的每一列都以成堆的形式存在。在桩的模型中,添加:

belongs_to: foo

在 foo 的模型中,添加:

has_many: piles

在你的控制器中,一旦你手头有一个 foo,你就可以使用 foo.piles 访问它的堆

【讨论】:

  • 好吧,我这样做是为了自学 RoR,所以我应该正确地自学并这样做(尽管 Farrel 的解决方案很简单)。在这种情况下,在 Foo 创建页面中获取 Piles 对象的输入值的最佳方法是什么? form_for(@foo) 可能不会正常工作;我想要一个循环 在我的 form_for 中创建
    s 吗?我想不出正确的语法。 ...我应该为此创建一个新问题吗?
  • 对很多看似合理的变体进行了尝试,但我无法让它工作,而且看起来很复杂。我将把这个答案标记为正确(尽管我最终可能会求助于 Farrel 的架构不太简单的解决方案),并提出一个关于表单的新问题。
猜你喜欢
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2023-02-10
  • 2022-10-25
  • 2022-11-16
  • 2020-03-06
  • 2011-12-07
  • 2011-04-30
相关资源
最近更新 更多