【发布时间】:2011-03-26 07:34:30
【问题描述】:
假设您有两种不同类别的用户,它们具有不同的个人资料:一种用于音乐艺术家,另一种用于听众。每个配置文件都有一些重叠的属性和一些不同的属性。您是否应该为每个不同的配置文件设置单独的模型?或者你应该在用户表中有一个二进制数据列来判断用户是否是艺术家?这将如何构建?
【问题讨论】:
标签: ruby-on-rails ruby model profile
假设您有两种不同类别的用户,它们具有不同的个人资料:一种用于音乐艺术家,另一种用于听众。每个配置文件都有一些重叠的属性和一些不同的属性。您是否应该为每个不同的配置文件设置单独的模型?或者你应该在用户表中有一个二进制数据列来判断用户是否是艺术家?这将如何构建?
【问题讨论】:
标签: ruby-on-rails ruby model profile
您可以使用Single Table Inheritance,这可以通过创建模型的子类来实现。
生成带有type:string 列的Profile 模型(The name can be overriden):
$ rails g model Profile type:string
现在,在 profile.rb 中,对您的模型进行子类化:
class Profile < ActiveRecord::Base
# Common profile attributes
end
class Artist < Profile
# Things specific to an artist profile
end
class Listener < Profile
# Things specific to a listener profile
end
当您创建Artist 或Listener 时,它将与配置文件的类型一起保存在profiles 表中。
例如,如果您执行Artist.create,它将与type='Artist' 一起保存在profiles 表中。
当您获取记录时,它将以其适当的模型返回,无论是Artist、Listener 还是通用的Profile。
有关此技术的更多信息,请查看this question。
This blog post 也很好地解释了它。
【讨论】:
一个名为 Profile 的默认模型包含公共属性和另外两个(Artistic、Listener)模型,每个模型具有特定属性
并且在配置文件中,使用一个字段来保存类型(艺术家或听众)
只是我的意见。
【讨论】: