Rails:是否有处理动态字段表示的宝石?

时间:2013-07-13 11:20:48

标签: ruby-on-rails metadata

我将在几个星期内开始一个项目,这是一个webapp,可以为同一家公司的子公司处理多种语言的网站。虽然前端可能看起来不同,但他们都订阅了相同的模型设计。

但主要要求之一是每个子公司都可以选择在其网站上显示模型的哪些字段。

例如:有一个Program模型

class Program < AR
  attr_accessible :starting_at, :ending_at, :name, :price, :country
end

因此,如果我拥有该公司的两个子公司,即美国和瑞典,他们都使用相同的模型来展示节目。但美国分支机构希望显示包含所有程序的表格,并且每个程序仅显示starting_atending_atnameprice。瑞典分支机构想要做同样的事情,但不想展示ending_at而是展示country

此外,他们希望能够选择通过网络界面显示哪些字段,因为它可以随时间变化。

所以我的想法是 - 因为有很多元建模正在进行 - 想出一个MetaProgram模型,或者左右,它保存了应该显示哪个子公司的信息等等。但是这个会导致ActiveRecord的动态SQL语句,因为我总是必须选择必须选择哪些字段,然后选择实际数据通过前端显示它...

有没有更好的解决方案,或者是一种踩着这种东西的宝石?

PS:抱歉标题含糊不清

1 个答案:

答案 0 :(得分:3)

我不知道这是否正是您所寻找的。

我使用ActiveRecord::Store。它就像是模型的键/值存储。

你有一个这样的表:

create_table do |t|
  t.text :metadata # just a text column, will store serialized hash
end

这样的模型:

class Program < ActiveRecord::Base     
  store :metadata, :accessors => [:starting_at, :ending_at]

  # validate like normal fields
  validates :starting_at, :presence => true
end

您只需找到一种方法,根据您在问题中提到的条件动态添加商店访问者哈希。

存储的元数据无法编入索引并且您无法在查询中使用它们,这可能是一个缺点。

我找到了一个很好的小教程和关于这个主题的解释here