如何根据类型创建具有不同属性的模型

时间:2012-07-20 15:03:13

标签: ruby-on-rails associations models

我有一个类别模型

   default_scope :order => 'display_order asc'
   has_many :resources, :dependent => :destroy

# == Schema Information
#
# Table name: categories
#
#  id          :integer(4)      not null, primary key
#  name        :string(255)
#  description :string(255)
#  created_at  :datetime        not null
#  updated_at  :datetime        not null
#

我有一个资源模型:

belongs_to :category
  # belongs_to :submitter, :class_name => 'User', :foreign_key => "submitter_id"
  has_and_belongs_to_many :filetypes
  has_many :users, :through => :kits
  has_many :kits
  belongs_to :submitter, class_name: "User"
  belongs_to :author

==架构信息

#
# Table name: resources
#
#  id                 :integer         not null, primary key
#  title              :string(255)
#  url                :string(255)
#  description        :string(255)
#  price              :decimal(, )
#  created_at         :datetime        not null
#  updated_at         :datetime        not null
#  category_id        :integer
#  image_file_name    :string(255)
#  image_content_type :string(255)
#  image_file_size    :integer
#  image_updated_at   :datetime
#  status             :string(255)
#  submitter_id       :integer
#  author_id          :integer
#

客户希望能够创建类别,但根据类别为资源分配不同的属性。

实施例: 创建的类别:'图书' 他希望有字段'作者'例如,存储在资源模型中。

创建的类别:'会议' 他希望有领域' location' date'例如,存储在资源模型中。

我如何对其进行建模以使其动态且易于长期维护?

2 个答案:

答案 0 :(得分:0)

一个想法是为一个类别的字段设置一个单独的表。例如,您的设置可能如下所示:

category HABTM category_fields
category_field HABTM categories
category_field has_many category_field_values
category_field_value belongs_to category_field

然后,当您的客户创建了一个新类别,即Books时,他可以在该类别中添加一个名为author的新category_field。然后,如果他想在图书类别中添加新作者,他会将category_field_value(即JK罗琳)添加到author category_field

因此, Books category会有author category_fieldauthor category_field会有一个category_field_value(JK罗琳)。

答案 1 :(得分:0)

你可以看看>> https://github.com/moiristo/dynamic_attributes

或者您考虑使用像MongoDB或redis这样的Schemaless数据库?

您还可以使用hstore,它是postgresql中的键值类型。