rails 3动态创建具有存储在数据库表中的属性的模型

时间:2011-04-21 10:12:04

标签: ruby-on-rails dynamic attributes model formtastic

我正在创建一个ruby on rails应用程序,它存储了一个用户最喜欢的出版物,偶然发现了一个问题,需要一些帮助。

用户可以添加任意数量的不同类型的出版物,例如书籍,电影,报纸,文章等。每种出版物类型都有不同的属性,例如书籍可能有作者和出版商,以及电影可能有导演和制片人。单个出版物有许多属性。

我的应用目前看起来像这样:我有一个出版物资源,用于存储各类出版物。有一个名为 attribs 的资源,它存储特定发布的所有属性。最后还有第三种资源叫做收藏夹

class Publication < ActiveRecord::Base
 has_many :attribs

 # columns in this model => name, hidden

 # example ( :name => "movie", :hidden => false )
end

class Attrib < ActiveRecord::Base
 belongs_to :publication

 # columns in this model => publication_id, name, datatype

 # example (:publication_id => 1, :name => "Movie Title", :datatype => "string")
 # example (:publication_id => 1, :name => "Director", :datatype => "string")
end

class Favourite < ActiveRecord::Base

 # columns in this model => data, reason

 # example (:data => "[serialized form data]", :reason => "some reason why its a fav")

end

当用户创建新收藏夹并选择出版物时,我希望使用用户为该特定出版物选择的属性生成表单。

有没有办法可以动态创建包含存储在数据库表中的属性的模型/表单?

由于Formtastic是一个动态表单生成器,可以用它来创建表单吗?

对我而言,这似乎过于复杂,但如果我的应用程序中没有大量的表,我无法想出另一种方法。

2 个答案:

答案 0 :(得分:1)

Formtastic和Simple Form Gems需要一个模型来为您生成表单。看看这篇文章here。创建一个无表格模型。然后使用无表格模型创建临时模型。然后从包含该模型的列值的表中获取临时模型的列,就像在该链接中为Foo完成一样。使用临时类的实例,您可以使用Formtastic并为其生成表单。

答案 1 :(得分:0)

我认为你可以自己实现它。

@publication.attribs.each do |attrib|
  case attrib.datatype
  when "string"
    f.text_field attrib.name
  when "text"
    f.text_area attrib.name
  when "password"
    f.password_field attrib.name
  ...
end